3

我需要delete所有rowstable 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)在此处输入图像描述

4

3 回答 3

5

出于 Sql 注入和其他原因(包括查询计划的缓存,并且不必担心转义引号 :-),而不是进行字符串连接,而是参数化对 的调用:sp_executesql

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;

小提琴

于 2014-02-27T11:03:33.213 回答
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

于 2014-02-27T10:58:36.103 回答
0

如果可以的话,我会选择StuartLC 的答案- 参数显然是要走的路。

只是为了向您展示如果您别无选择只能这样做,您可以转义单引号。引号是必需的,因为 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可以看到脚本,而不是盲目地尝试运行它。

于 2014-02-27T11:14:42.503 回答