我想将@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
答案 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>