SQL-динамические строки запроса, когда переменная содержит одиночную цитату
У меня есть строка запроса SQL, которая выглядит следующим образом:
DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 +
' SELECT 0 as Type1, 0 as Type2, ' +
'''' + @name + ''' as CompanyName ' +
' FROM #tempTable2 tt2'
Запрос выполняется отлично, за исключением двух имен, которые содержат одиночную кавычку (например, Pete Corner). Когда одно из этих имен становится частью запроса, оно прерывает строку запроса. Я подумал, что проще всего заменить одиночную цитату, подобную этой замене (@name, '' '', ''), но она не работает, потому что я уже в строке и поэтому ее влияние на остальные выражение. К сожалению, изменение самой таблицы не является вариантом.
Как я могу заменить или удалить эти одинарные кавычки?
Дополнение: Я прошу прощения, я не включил часть, где @name фактически заполняется из другой таблицы базы данных соединением, поэтому установка значения @name перед созданием строки. Мне кажется, это будет сложно для меня.
Ответы
Ответ 1
Я думаю, что это должно сделать это:
DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 +
' SELECT 0 as Type1, 0 as Type2, ' + ''''+
replace( @name ,'''','''''')+''''+' as CompanyName
FROM #tempTable2 tt2'
Ответ 2
Зачем вам вообще нужно это делать? Вы должны передавать сильные параметры sp_executesql
вместо того, чтобы перетаскивать все ваши параметры в одну строку и использовать EXEC()
. Подробнее об этом здесь.
DECLARE @sql NVARCHAR(MAX), @name NVARCHAR(32);
SET @name = 'Pete' Corner';
SET @sql = 'INSERT INTO ' + @tempTable1 +
' SELECT 0 as Type1, 0 as Type2, @name as CompanyName ' +
' FROM #tempTable2 tt2';
EXEC sp_executesql @sql, N'@name NVARCHAR(32)', @name;
Я предполагаю, что параметр @name
фактически заполняется из другого места, и если вы используете правильную параметризацию, вам не придется иметь дело с экранированием '
.
Теперь я не совсем уверен, что должен представлять @tempTable1
, или если вы можете получить доступ к #tempTable2
из этой области, но всякий раз, когда вы обнаруживаете, что используете замену, которая требует ''''
или ''''''
(или оба), вы должны спросить себя, может быть, там лучший способ.
Ответ 3
Вы можете использовать sp_executesql системную процедуру. sp_executesql позволит вам вызывать динамический SQL с параметром @name, а не встраивать его в SQL.
DECLARE @sql nvarchar(max),
@name varchar(50)
SET @name = 'qwe'''
SET @sql = 'INSERT INTO ' + @tempTable1 +
' SELECT 0 as Type1, 0 as Type2, ' +
'@name as CompanyName ' +
'FROM #tempTable2 tt2'
--PRINT @sql
EXEC sp_executesql @sql, N'@name varchar(50)', @name