2012-10-25 127 views
0

Possible Duplicate:
Is there a way to specify table name as a string?在INSERT語句

下面的腳本使用表名的變量將無差錯地執行:

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的存儲過程中使用此腳本。

回答

5

我認爲你要麼需要的參數值插入到使用串聯的字符串:

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

或使用sp_executesql

0

您的代碼對我來說看起來並不完整,但您應該使用sp_ExecuteSQL併爲該語句定義參數。有關sp_ExecuteSQL的更多信息,請參閱MSDN。

0

你有兩種選擇INSERT

  1. 要麼你插入明確的價值觀 -

    INSERT INTO dbo.YourTable(list of columns) 
    VALUES (list of values) 
    
  2. 或插入使用SELECT命令返回列的相應的號碼:

    INSERT INTO dbo.YourTable(list of columns) 
        SELECT (list of columns) 
        FROM dbo.SomeOtherTable 
        WHERE somecondition 
    

但你不能混合兩個 - 你不能有VALUES(....),然後在那裏提供一個SELECT聲明。使用選項#1 #2 - 選擇一個。

1
SET @SQL = 'INSERT INTO '[email protected]+' (VALUES '''[email protected]+''', '''+ 
    @SourceIdent+''', '''[email protected]+''', '''[email protected]+''', '''[email protected]+''')'; 

將字符串傳遞給EXECUTE後,變量不再處於範圍內。您需要通過連接值來構建傳入的字符串。而且,對於這種類型的INSERT,VALUES比SELECT更合適。

如果你的XML可能有引號字符,你需要做的,而不是下面...

SET @SQL = 'INSERT INTO '[email protected]+' (VALUES '''[email protected]+''', '''+ 
    @SourceIdent+''', '''[email protected]+''', '''+REPLACE(@ChangedData,'''','''''')+''', '''[email protected]+''')'; 
+0

能否請您提供這個答案背後的一些背景/推理爲有機磷農藥中受益。 –

+0

@JK:編輯推理 –

+0

謝謝,你+1。 –