靠近'的语法不正确=';sp_executesql

靠近'的语法不正确=';sp_executesql,sql,sql-server,tsql,sp-executesql,Sql,Sql Server,Tsql,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 但它是抛出我的错误msg102,15级,状态1,第1行

我需要在一些
删除
所有
,其中
值为空字符串。(我有多个具有类似名称的表)

我尝试执行那些字符串形式的sql语句:

DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) =''    
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''
exec sp_executesql @sql
但它是抛出我的错误
msg102,15级,状态1,第1行
“=”附近的语法不正确。

我试着在大约一个小时后弄明白。 任何帮助都将不胜感激

编辑: 这是我删除最后一个配额后得到的结果
@tableName
nvarchar(最大值)
。 您有两个引号:

set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''
将其更改为:

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

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

如果可以的话,我会选择-参数显然是一种选择

为了告诉你如果你别无选择,只能这样做,你可以避开单引号。引号是必需的,因为Value列似乎是一个字符串(根据问题中设置为
@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
来查看脚本,而不是盲目地尝试运行它。

如果脚本末尾有一个配额,则脚本的其余部分将被视为字符串。@harry180-您有两个单引号。你只需要一个。我已经包括了一个SQL FIDLE来演示我的代码工作。@darrendavis您的SQLFIDLE中的内容似乎与您在此处发布的代码不同。从您的小提琴中:
set@sql=N'DELETE From SampleTable WHERE Value='+@emptyValue++'
-注意末尾的两个引号,而不是一个。从末尾删除配额后,仍然返回相同的错误:(我认为问题在于,根据问题中分配给
@emptyValue
的默认值,可以推断value列是一个字符串-您需要将其用单引号括起来。如果他必须使用exec,那么这是最好的方法。
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) = ''
set @sql = N'DELETE FROM SampleTable WHERE Value='''+@emptyValue+''''
exec sp_executesql @sql