T-SQLのみで既存のテーブルから作成スクリプトを生成する方法はありますか(T-SQLはSMOにアクセスできないため、SMOを使用しません)。テーブル名を受け取り、指定されたテーブルの作成スクリプトを含む文字列を返すストアドプロシージャがあるとしますか?
これにアプローチする別の方法があるかもしれないので、今私が直面している状況を説明させてください。数十のデータベースを持つインスタンスがあります。これらのデータベースはすべて同じスキーマ、すべて同じテーブル、インデックスなどを持っています。これらは、サードパーティのソフトウェアインストールの一部として作成されました。アドホックな方法でデータを集約できるように、それらを操作する方法が必要です。dba.seの素敵な人々がここですでに私を助けてくれました別のデータベースにトリガーを作成する方法は?
現在、すべてのデータベースのテーブルから選択を行う方法を見つける必要があります。という名前のテーブルにすべてのデータベース名を記録し、Databasees
それらすべてに対してselectステートメントを実行する次のスクリプトを作成しました。
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
ただし、上記のスクリプトは失敗し、次のメッセージが表示されます。
テーブル '#tmp'のID列の明示的な値は、列リストが使用され、IDENTITY_INSERTがONの場合にのみ指定できます。
これを追加する:
SET IDENTITY_INSERT #tmp ON
列リストを指定して汎用的に保つことはできないため、助けにはなりません。
SQLでは、特定のテーブルのIDをオフに切り替える方法はありません。列をドロップして列を追加するだけで、列の順序が明らかに変更されます。また、列の順序が変更された場合は、列リストを指定する必要があります。これは、クエリするテーブルによって異なります。
したがって、T-SQLコードでcreate table scripを取得できたら、文字列操作式で操作してID列を削除し、データベース名の列を結果セットに追加できると考えていました。
誰でも私が望むものを達成する比較的簡単な方法を考えることができますか?