4

別のデータベースにあるテーブルの列名を取得する必要があります。次のスクリプトはアクティブなデータベースに対して機能しますが、同じサーバー インスタンス内の別のデータベースに対して実行する必要があります。

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しかし、実行すると、有効な変数として解釈されません。私は何が欠けていますか?

4

2 に答える 2

3

あなたがその構文をどこで選んだかはわかりませんが、これが私がそれを行う方法です:

-- I assume these are parameters, so declaring them separately:
DECLARE 
    @DatabaseName SYSNAME = N'db_name',
    @TableName SYSNAME = N'table_name';

DECLARE 
    @sql NVARCHAR(MAX), 
    @columnList NVARCHAR(MAX);

SELECT @sql = N'SELECT @ColumnList = COALESCE(@ColumnList + '','', '''') 
    + c.name
    FROM [$db$].sys.columns AS c
    INNER JOIN [$db$].sys.tables AS o
    ON c.[object_id] = o.[object_id]
    WHERE o.name = @TableName;';

SET @sql = REPLACE(@sql, '$db$', @DatabaseName);

EXEC sp_executesql @sql, 
    N'@ColumnList NVARCHAR(MAX) OUTPUT, @TableName SYSNAME',
    @ColumnList OUTPUT, @TableName;

SELECT @ColumnList
于 2012-04-17T21:14:58.433 に答える
1

@ params=引数から記号を削除し、@ ColumnList引数の後に orを追加する必要があります。OUTOUTPUT

正しい:

EXECUTE @sp_executesql @SQL,
        N'@ColumnList nvarchar(max) OUT, @TableName sysname',
        @ColumnList OUT, @TableName

正しくない:

EXECUTE @sp_executesql @SQL,
        N'@ColumnList = nvarchar(max) OUT, @TableName = sysname',
        @ColumnList, @TableName
于 2012-04-17T22:18:18.890 に答える