Поместите одинарные кавычки в одинарные кавычки в SQL Строка сервера - PullRequest
0 голосов
/ 13 января 2020

У меня есть запрос на обновление ниже.

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

Я хочу поставить одинарные кавычки в запросе 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

Ниже приведены данные теста.

create table test2 
(
    test varchar(50)
)

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

Я получаю эту ошибку при выполнении запроса SQL String Builder:

Неверный синтаксис рядом с ') ='

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 13 января 2020

Ошибка, которую вы получаете, потому что строка оператора недопустима. Вы получите неэкранированную строку.

Вам нужно добавить экранированную кавычку ('') для каждой нужной кавычки (('' '' ')) следующим образом:

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 
1 голос
/ 13 января 2020

когда вы используете isnull, вы должны предоставить 2 параметра

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

Вам нужно предоставить что-то для ??? и в настоящее время его пустое

Заменить на

WHERE ISNULL([' + c.name + '], ' + '''''' + ') 
0 голосов
/ 13 января 2020

Одиночные кавычки являются самостоятельными; то есть вы объединяете два в литерал, чтобы получить один в окончательной строке.

Кроме того, вы хотите, чтобы функция 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)
...