【问题标题】:Incorrect syntax near '=' sp_executesql'=' sp_executesql 附近的语法不正确
【发布时间】:2014-02-27 10:55:39
【问题描述】:

我需要 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)

【问题讨论】:

    标签: sql sql-server tsql sp-executesql


    【解决方案1】:

    由于 Sql 注入和其他原因(包括查询计划的缓存,并且不必担心转义引号 :-),而不是进行字符串连接,parameterize 调用 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;
    

    Fiddle

    【讨论】:

    • 如果他必须使用 exec 那么这是最好的方法。
    【解决方案2】:

    你有两个引号:

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

    改成:

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

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

    【讨论】:

    • 最后只有一个配额,我的脚本的其余部分被视为字符串。
    • @harry180 - 你有两个单引号。你只需要一个。我已经包含了一个 SQL Fiddle 来演示我的代码工作。
    • @DarrenDavies 看来您的 SQLFiddle 中的内容与您在此处发布的代码不同。从你的小提琴:set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+'' - 注意最后的两个引号,而不是一个。
    • 从最后删除配额后仍然返回相同的错误:(
    • 我认为问题在于,从问题中分配给@emptyValue的默认值推断出Value列是一个字符串-您需要将其用单引号括起来。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2015-12-12
      • 2013-12-16
      • 1970-01-01
      • 2018-08-14
      • 2011-03-11
      相关资源
      最近更新 更多