将单引号放入 SQL Server 字符串中的单引号中



我在下面有更新查询。

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字符串生成器查询时出现此错误:

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

我做错了什么?

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

您需要为所需的每个引号("(添加一个转义引号 ("(,如下所示:

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 

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

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

您需要为???提供一些东西,目前它是空

的替换为

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

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

此外,您希望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)

最新更新