0

重複の可能性:
テーブル名を文字列として指定する方法はありますか?

次のスクリプトはエラーなしで実行されます。

DECLARE @SourceDB sysname, @SourceTable sysname, 
        @UserID NVARCHAR(500), @DMLType CHAR(1), @SourceIdent uniqueidentifier, @ChangedData XML,
        @SQL as NVARCHAR(MAX)

-- xml datatype and its capabilities rock
SELECT  @SourceDB = T.c.query('/AuditMsg/SourceDb').value('.[1]', 'sysname'),
        @SourceTable = T.c.query('/AuditMsg/SourceTable').value('.[1]', 'sysname'),
        @SourceIdent = T.c.query('/AuditMsg/SourceIdent').value('.[1]', 'uniqueidentifier'),
        @UserID = T.c.query('/AuditMsg/UserId').value('.[1]', 'NVARCHAR(50)'),
        @DMLType = T.c.query('/AuditMsg/DMLType').value('.[1]', 'CHAR(1)'),
        @ChangedData = T.c.query('*')
FROM    @msgBody.nodes('/AuditMsg/ChangedData') T(c)

INSERT INTO dbo.AVE_Stamm(SourceDB, SourceIdent, UserID, DMLType, ChangedData)
SELECT @SourceDB, @SourceIdent, @UserID, @DMLType, @ChangedData

しかし、INSERTステートメントを次のように変更すると

SET @sql = 'INSERT INTO @SourceTable (SELECT @SourceDB, @SourceIdent, @DMLType, @ChangedData, @UserID)';
EXEC (@sql);

もう機能していません。誰かが私を助けてくれませんか、ここで何が問題なのですか?

このスクリプトを SQL Server 2008 R2 のストアド プロシージャで使用します。

4

3 に答える 3

7

連結を使用してパラメーター値を文字列に挿入する必要があると思います。

SET @sql = 'INSERT INTO ' + @SourceTable + ' SELECT ....';
EXEC (@sql);

またはsp_executesqlを使用します。

于 2012-10-25T15:37:31.910 に答える
1
SET @SQL = 'INSERT INTO '+@SourceTable+' (VALUES '''+@SourceDB+''', '''+
    @SourceIdent+''', '''+@DMLType+''', '''+@ChangedData+''', '''+@UserID+''')';

文字列をEXECUTEに渡すと、変数はスコープ内になくなります。値を連結して、渡す文字列を作成する必要があります。また、このタイプの INSERT には、SELECT よりも VALUES の方が適切です。

XML に引用符が含まれている可能性がある場合は、代わりに次の操作を行う必要があります...

SET @SQL = 'INSERT INTO '+@SourceTable+' (VALUES '''+@SourceDB+''', '''+
    @SourceIdent+''', '''+@DMLType+''', '''+REPLACE(@ChangedData,'''','''''')+''', '''+@UserID+''')';
于 2012-10-25T15:57:23.940 に答える
0

あなたのコードは完全ではないように見えますが、sp_ExecuteSQLを使用し、ステートメントのパラメーターを定義する必要があります。sp_ExecuteSQL の詳細については、MSDN を参照してください。

于 2012-10-25T15:37:55.637 に答える