我需要delete
某些rows
table
中的所有where
值为空字符串。(我有多个名称相似的表格)。
我尝试执行字符串中的sql语句:
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) =''
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''
exec sp_executesql @sql
但它让我错误Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '='.
我试着弄清楚大约一个小时了。 任何帮助将不胜感激。
修改
这是删除最后一个配额后得到的内容。 @tableName
是nvarchar(MAX)
。
答案 0 :(得分:5)
而不是进行字符串连接,parameterize调用sp_executesql
,用于Sql注入和其他原因(包括缓存查询计划,而不必担心转义引号: - ):
DECLARE @sql AS NVARCHAR(MAX);
DECLARE @emptyValue AS NVARCHAR(1) ='';
set @sql = N'DELETE FROM SampleTable WHERE Value=@emptyValue';
exec sp_executesql @sql, N'@emptyValue NVARCHAR(1)', @emptyValue = @emptyValue;
答案 1 :(得分:1)
你有两个引号:
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''
将其更改为:
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue
答案 2 :(得分:0)
如果可以,我会选择StuartLC's answer - 参数显然是要走的路。
只是为了告诉你如果别无选择,该怎么办,你可以逃避单引号。引号是必需的,因为值列似乎是一个字符串(从问题中设置为@emptyValue
的默认值推断)。
要逃避单一报价,您需要另一个单引号。试一试:
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) = ''
set @sql = N'DELETE FROM SampleTable WHERE Value='''+@emptyValue+''''
exec sp_executesql @sql
请注意,您始终可以PRINT @sql
查看脚本,而不是盲目地尝试运行它。