2016-12-21 3 views
0

У меня есть хранимая процедура, которая реализована в Dynamic SQL. Я пытаюсь включить ключевое слово IN и передать фиксированные значения в списке между одинарными кавычками.IN ключевое слово в динамическом SQL

Я хочу написать что-то вроде этого:

where grp.Status in ('A,S') 

но приведенное выше утверждение уже заключены в одинарные кавычки.

Я пытался использовать что-то вроде ниже:

where grp.Status in (' +QUOTENAME('A,S','''')+ 

но запрос только признавая первое значение в списке т.е. «A».

Я также прочитал об использовании функции split и поместил значения в таблицу temp и вместо этого использовал столбец таблицы temp. Но я не должен был делать этот процесс для крошечного списка.

Любые предложения и решения приветствуются.

ответ

2

Вы можете просто поместить список в SQL:

'where grp.Status in (''' + replace('A,S', ',', ''',''') + ''') . . . 

Если бы я получил эти одиночные кавычки правильно, это должно произвести результат, как:

where grp.Status in ('A','S') . . . 
+0

В нашей базе данных есть что-то похожее на обработку таких вещей, но хороший лорд быстро превращается в нечитаемый беспорядок. – levelonehuman

+2

@levelonehuman, поэтому использование функции split и последующее соединение с таблицей намного проще в обслуживании. – HLGEM

0

Если вы не хотите использовать функция split вы можете сделать следующее с вашим динамическим sql.

declare @xml xml 
     , @list Varchar(100) = 'A,B' 

set @xml = N'<root><r>' + replace(@list, ',' ,'</r><r>') + '</r></root>' 

Declare @Sql Nvarchar(MAX); 

SET @Sql = N'Select * from TableName grp 
      WHERE grp.Status IN (
            select r.value(''.'',''varchar(max)'') as item 
            from @xml.nodes(''//root/r'') as records(r) 
           )' 

Exec sp_executesql @Sql 
        ,N'@xml XML' 
        ,@xml 
Смежные вопросы