Mevcut bir tablodan yalnızca T-SQL'de bir oluşturma komut dosyası oluşturmanın bir yolu var mı (T-SQL'in SMO'ya erişimi olmadığından SMO kullanmadan). Diyelim ki bir tablo adı alan ve verilen tablo için create betiğini içeren bir dize döndüren saklı bir prosedür?
Şimdi, karşılaştığım durumu açıklamama izin verin, çünkü buna yaklaşmanın farklı bir yolu olabilir. Birkaç düzine veritabanına sahip bir örneğim var. Bu veritabanlarının tümü aynı şemaya, aynı tablolara, indekslere vb. Sahiptir. Üçüncü parti bir yazılım kurulumunun parçası olarak yaratılmışlar. Onlarla çalışmanın bir yolunu bulmalıyım, böylece verileri onlardan geçici bir şekilde toplayabiliyorum. Dba.se'deki güzel insanlar burada bana çoktan yardım ettiler Farklı bir veritabanında tetikleyici nasıl oluşturulur?
Şu anda tüm veritabanlarındaki bir tablodan seçim yapmanın bir yolunu bulmam gerekiyor. Tüm veritabanı adlarını bir tabloya kaydettim ve hepsine Databasees
bir select cümlesi uygulamak için aşağıdaki betiği yazdım:
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
DROP TABLE #tmp
select * into #tmp from Database1.dbo.Table1 where 1=0
DECLARE @statement nvarchar(max) =
N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1'
DECLARE @LastDatabaseID INT
SET @LastDatabaseID = 0
DECLARE @DatabaseNameToHandle varchar(60)
DECLARE @DatabaseIDToHandle int
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
WHILE @DatabaseIDToHandle IS NOT NULL
BEGIN
DECLARE @sql NVARCHAR(MAX) = QUOTENAME(@DatabaseNameToHandle) + '.dbo.sp_executesql'
EXEC @sql @statement
SET @LastDatabaseID = @DatabaseIDToHandle
SET @DatabaseIDToHandle = NULL
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
END
select * from #tmp
DROP TABLE #tmp
Ancak, yukarıdaki komut dosyası aşağıdaki iletiyle başarısız oluyor:
'#Tmp' tablosundaki kimlik sütunu için açık bir değer yalnızca bir sütun listesi kullanıldığında ve IDENTITY_INSERT ON olduğunda belirlenebilir.
Bunu ekleyerek:
SET IDENTITY_INSERT #tmp ON
yardımcı olmuyor, çünkü sütun listesini belirleyemiyorum ve genel olarak tutamıyorum.
SQL'de kimliği belirli bir masaya kapatmanın bir yolu yoktur. Yalnızca bir sütunu bırakabilir ve bir sütun ekleyebilirsiniz; bu, açıkça sütun sırasını değiştirir. Ve sütun sırası değişirse, yine, sorguladığınız tabloya bağlı olarak farklı olacak olan sütun listesini belirtmeniz gerekir.
Bu nedenle, T-SQL kodumda tablo tablosu komut dosyasını alabilirsem, kimlik sütununu kaldırmak ve sonuç kümesine Veritabanı adı için bir sütun eklemek için onu dize işleme ifadeleriyle değiştirebilirim .
Herhangi biri istediğimi elde etmek için nispeten kolay bir yol düşünebilir mi?