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