SQL Server将参数化名称表插入IF EXISTS

时间:2016-02-21 11:37:40

标签: sql-server stored-procedures

我想将@inputData插入ColumnData,如果它不存在,以防止重复数据到名为参数@TableName的表。在' dbo。@ TableName'。

出错
SET @insertSQL = 'INSERT INTO '+ @TableName + ' (ColumnData) VALUES ('''+@inputData+''');'

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 ('''+@inputData+''');'

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

1 个答案:

答案 0 :(得分: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语句。< / p>