2015-12-24 1 views
2

Мне нужно настроить систему, которая предоставляет мне область для ввода операторов SQL. Эти операторы могут иметь не связанные с SQL переменные. Важно заметить, что мы не можем изменить систему, которую мы настраиваем.Конфигурирование динамического SQL-запроса SQL «IN» в системе с заранее заданными переменными

Таким образом, система дает нам {0}, {1}, {2} ведьма та же система заменит следующее исполнение:

  • {0} ->string1
  • {1} ->string2
  • {2} ->'string3','string4','string5' (или столько, сколько необходимо)

Запрос мы настроить выглядит следующим образом:

Select col1 
from table1 
where col2 = '{0}' and col3 = '{1}' and col4 in ({2}) 

, который производит это при выполнении:

Select col1 
from table1 
where col2 = 'string1' and col3 = 'string2' 
    and col4 in ('string3', 'string4', 'string5') 

В новом требовании мы должны использовать различные столбцы для фильтрации этих 3-х параметров. Поэтому первоначальная идея заключалась в использовании динамического SQL.

Проблема теперь в {2}, поскольку мы не смогли перехватить ее значение из окна конфигурации в достаточно хорошем формате.

Мы пытались использовать:

declare @mylist 
set @mylist = {2} 

, но это приводит к неправильному высказыванием:

declare @mylist 
set @mylist = 'string3','string4','string5' 

еще одна попытка была сделать:

declare @sql 
set @sql = 'Select '+ @myCol1 +' from table1 where '+ @myCol2 +' = '''{0}''' and '+ @myCol3 +' = '''{1}''' and '+ @myCol4 +' in ({2})' 
exec sp_executesql @sql 

, но это приводит к следующим неверный оператор внутри @sql (ошибка не удваивается ', что пришли из {2}:

'Select col1 from table1 where col2 = ''string1'' and col3 = ''string2'' and col4 in ('string3','string4','string5')' 

Есть ли альтернатива для того, что я пытаюсь сделать?

Я бы очень признателен за помощь.

+0

Это выглядит как заполнители форматирования строки .NET, но я могу ошибаться - поэтому, если ваш оператор содержит * несколько * заполнителей с тем же номером (например, 'WHERE col4 IN ({2}) ИЛИ col5 IN ({2}) '), оба они будут заменены одним и тем же списком? Кроме того, сколько разных столбцов мы можем иметь? (Это легко перечисляемый набор возможностей)? –

ответ

3

Вы можете попробовать Мессинг с SET QUOTED_IDENTIFIER, такие как:

SET QUOTED_IDENTIFIER OFF 

declare @mylist varchar(200) 
set @mylist = "{2}" 

SET QUOTED_IDENTIFIER ON 

select @mylist /* ''string3'',''string4'',''string5'' */ 

Новая строка должна быть пригодна для работы с динамическим запросом SQL вы предоставили. См. Это Fiddle.

+1

очень интересный вопрос о проблеме ... 'QUOTED_IDENTIFIER' был моим ответом! Но чтобы улучшить ваш ответ, я предлагаю удалить инструкцию 'replace'.Просто заменив строку 'set @ mylist' на' set @mylist = "{2}" 'в вашем ответе, моя проблема была решена, спасибо! –

+0

Рад, что я мог бы помочь. Я удалил «замену» в своем ответе. – ForguesR

Смежные вопросы