【问题标题】:Put single quotes into single quotes in SQL Server string将单引号放入 SQL Server 字符串中的单引号中
【发布时间】:2020-01-13 14:28:49
【问题描述】:

我在下面有更新查询。

update tableName 
set columnName = null 
where isnull(columnName, '') = ''

我想在 SQL Server 字符串生成器查询中添加单引号,以便可以对表中的每一列执行上述查询。请参阅此查询:

Declare @sql2 varchar(max) = ''
declare @tablename2 as varchar(255) = 'test2'
select @sql2 = @sql2 + 'update [' + @tablename2 + '] set [' + c.name +']' + ' = NULL ' +
        ' WHERE ISNULL([' + c.name + '], ' + '' + ') = ' + ''
from sys.columns c
inner join sys.tables t on c.object_id = t.object_id 
where t.name = @tablename2
EXEC (@sql2)
go

以下是测试数据。

create table test2 
(
    test varchar(50)
)

insert into test2 
values (' ewewwe'), ('sdsddsds '), ('')

执行 SQL 字符串生成器查询时出现此错误:

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

我做错了什么?

【问题讨论】:

  • 这是如何插入单引号 SELECT '''' AS singleQuote
  • 看看QUOTENAME()函数

标签: sql sql-server escaping single-quotes


【解决方案1】:

您收到的错误是因为语句字符串无效。你最终得到一个未转义的字符串。

您需要为您需要的每个引号添加一个转义引号(''),('''''')如下:

Declare @sql2 varchar(max) =''
declare @tablename2 as varchar(255) ='test2'
select @sql2 = @sql2 + 'update [' + @tablename2 + '] set [' + c.name + ']' + ' = NULL ' +
        ' WHERE ISNULL([' + c.name + '], ' + '''''' + ') = ' + ''''''
from sys.columns c
inner join sys.tables t on c.object_id = t.object_id 
where t.name = @tablename2
EXEC (@sql2)
go 

【讨论】:

    【解决方案2】:

    使用isnull时,必须提供2个参数

    ' WHERE ISNULL([' + c.name + '], ' + '???' + ') = ' + ''
    

    您需要为 ???目前它是空的

    替换为

    WHERE ISNULL([' + c.name + '], ' + '''''' + ') 
    

    【讨论】:

      【解决方案3】:

      单引号是自转义的;也就是说,您将两个放在一个文字中以在最终字符串中得到一个。

      此外,您希望QUOTENAME() 函数处理封闭这些字段。它足够聪明,还可以考虑可能包含大括号或其他怪异的名称,此外,如果在可能干扰的语言中添加了任何其他内容,您可以期望它会被更新:

      DECLARE @sql2 varchar(max) = ''
      DECLARE @tablename2 as varchar(255) = 'test2'
      
      SELECT @sql2 = @sql2 + 
           'update ' + QUOTENAME(@tablename2) +
           ' set ' + QUOTENAME(c.name) + ' = NULL' +
           ' WHERE COALESCE(RTRIM(' + QUOTENAME(c.name) + '), '''') = '''' '
      FROM sys.columns c
      INNER JOIN sys.tables t on c.object_id = t.object_id 
      WHERE t.name = @tablename2
      
      EXEC(@sql2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多