2016-02-21 96 views
0

我想插入@inputDataColumnData如果它不存在以防止重複數據到名稱爲參數@TableName的表。 'dbo。@ TableName'錯誤。SQL Server將參數化名稱表插入IF EXISTS

SET @insertSQL = 'INSERT INTO '+ @TableName + ' (ColumnData) VALUES ('''[email protected]+''');' 

IF NOT EXISTS (SELECT 1 FROM [dbo].[@TableName] WHERE ColumnData = @inputData) 
    EXECUTE(@insertData) -- EXECUTE @insertData if ColumnData is not found 

我也試過這個(也拋出錯誤):

SET @insertSQL = 'INSERT INTO '+ @TableName + ' (ColumnData) VALUES ('''[email protected]+''');' 

IF NOT EXISTS (EXECUTE('SELECT 1 FROM [dbo]. '[email protected] ' WHERE ColumnData = ' + @inputData)) 
    EXECUTE(@insertData) -- EXECUTE @insertData if ColumnData is not found 
+0

什麼是你所得到的錯誤?你能分享一個截圖嗎? –

+1

如果存在,則替換if如果不存在.. – sagi

+0

無效的對象名稱'dbo。@ Tablename' - @Tablename沒有傳遞參數,而是使用'@Tablename'作爲其表名 –

回答

0

它看起來像你分割動態SQL語句。試試這樣:

DECLARE @SQL NVARCHAR(MAX) = N' 
IF NOT EXISTS (SELECT 1 FROM dbo.' + QUOTENAME(@TableName) + ' WHERE ColumnData = @inputData 
    INSERT INTO ' + QUOTENAME(@TableName) + ' (ColumnData) VALUES (@inputData)' 

EXEC sp_executesql @SQL, N'@inputData VARCHAR(128)', @inputData = @inputData 

表名cannot be parameterized,所以它必須附加。但是,強烈建議使用QUOTENAME以避免SQL注入。

在另一方面,@inputData可以發送作爲參數,這就是爲什麼sp_executesql可以使用。

一般來說,除非你不處理參數,儘量始終使用sp_executesql,而不是簡單的EXEC(),因爲EXEC部隊進入醜陋的字符串連接和可能的可注射的SQL語句。