'='sp_executesql附近的语法不正确

时间:2014-02-27 10:55:39

标签: sql sql-server tsql sp-executesql

我需要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 '='.

我试着弄清楚大约一个小时了。 任何帮助将不胜感激。

修改 这是删除最后一个配额后得到的内容。 @tableNamenvarchar(MAX)enter image description here

3 个答案:

答案 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;

Fiddle

答案 1 :(得分:1)

你有两个引号:

set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''

将其更改为:

set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue

http://sqlfiddle.com/#!3/ce8e3/4

答案 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查看脚本,而不是盲目地尝试运行它。