別のデータベースにあるテーブルの列名を取得する必要があります。次のスクリプトはアクティブなデータベースに対して機能しますが、同じサーバー インスタンス内の別のデータベースに対して実行する必要があります。
SELECT @ColumnList =
CASE
WHEN @ColumnList IS NULL THEN name
WHEN @ColumnList IS NOT NULL THEN @ColumnList + ',' + name
END
FROM sys.columns
WHERE object_id = Object_Id(@TableName);
ここに問題があります...データベースはコンパイル時に不明です。実行時にストアド プロシージャに渡されます。したがって、動的SQLを使用する以外に選択肢はありません。Use [DBName]
過去に動的SQLスクリプトで使用しようとしましたが、これができることに気付くまで常に問題に遭遇しました:
SET @SQL = 'SELECT Foo FROM Bar'
SET @sp_executesql = quotename(@DatabaseName) + '..sp_executesql'
EXECUTE @sp_executesql @SQL
しかし、上記のスクリプトでこれを行う方法がわかりません。私の最初の試みは次のようになりました:
-- @DatabaseName and @TableName are parameters of the
-- stored procedure containing this script
DECLARE @ColumnList nvarchar(max),
@SQL nvarchar(max),
@sp_executesql nvarchar(max) = quotename(@DatabaseName) + '..sp_executesql';
SET @SQL =
'SELECT @ColumnList =
CASE
WHEN @ColumnList IS NULL THEN name
WHEN @ColumnList IS NOT NULL THEN @ColumnList + '','' + name
END
FROM sys.columns
WHERE object_id = Object_Id(@TableName);'
EXECUTE @sp_executesql @SQL,
N'@ColumnList = nvarchar(max) OUT, @TableName = sysname',
@ColumnList, @TableName
@ColumnList
しかし、実行すると、有効な変数として解釈されません。私は何が欠けていますか?