'='附近的语法错误sp_executesql

问题描述:

我需要delete所有rows在一些tablewhere值是空字符串(我有多个表名称相似)。'='附近的语法错误sp_executesql

我tryed执行这些SQL语句是字符串:

DECLARE @sql AS NVARCHAR(MAX) 
DECLARE @emptyValue AS NVARCHAR(1) =''  
set @sql = N'DELETE FROM SampleTable WHERE Value='[email protected]+'' 
exec sp_executesql @sql 

但它把我的错误Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '='.

我tryed现在弄明白大约一个小时。 任何帮助,将不胜感激。

编辑: 这是我删除最后一个配额后得到的。 @tableNamenvarchar(MAX)enter image description here

而不是做字符串连接,parameterize调用sp_executesql,SQL注入和其他原因(包括缓存查询计划,而不必担心约:-)转义引号:

DECLARE @sql AS NVARCHAR(MAX); 
DECLARE @emptyValue AS NVARCHAR(1) =''; 
set @sql = N'DELETE FROM SampleTable WHERE [email protected]'; 
exec sp_executesql @sql, N'@emptyValue NVARCHAR(1)', @emptyValue = @emptyValue; 

Fiddle

+0

如果他必须使用exec,那么这是最好的办法。 –

你有两个报价:

set @sql = N'DELETE FROM SampleTable WHERE Value='[email protected]+'' 

将其更改为:

set @sql = N'DELETE FROM SampleTable WHERE Value='[email protected] 

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

+0

最后,我的脚本的其余部分被视为字符串。 – harry180

+0

@ harry180 - 你有两个单引号。你只需要一个。我已经包含一个SQL小提琴来演示我的代码工作。 –

+0

@DarrenDavies看起来你的SQLFiddle中的内容与你在这里发布的代码不一样。从你的小提琴:'set @sql = N'DELETE FROM SampleTable WHERE Value ='+ @ emptyValue +''' - 注意最后两个引号,而不是一个。 – Bridge

如果可以的话,我会跟StuartLC's answer去 - 参数显然是要走的路。

只是为了告诉你如果你别无选择,只能这样做,你可以逃避单引号。引号是必需的,因为“值”列显示为字符串(由问题中的默认值设置为@emptyValue推断)。

要转义单引号,您需要另一个单引号。试试这个:

DECLARE @sql AS NVARCHAR(MAX) 
DECLARE @emptyValue AS NVARCHAR(1) = '' 
set @sql = N'DELETE FROM SampleTable WHERE Value='''[email protected]+'''' 
exec sp_executesql @sql 

注意你总是可以PRINT @sql看到剧本,而不是一味地试图运行它。