2015-03-21 4 views
1

Я бег несколько запросов, которые используют список значений символов в выражении WHERE, например,Создать строку с вложенными кавычками в SQL

select * 
from table1 
where col1 in ('a','b','c') 

Список символов часто меняется, поэтому я хочу, чтобы сохранить строку в переменную и ссылаться на переменную во всех запросах, а не на сохранение нескольких копий строки. Я пробовал следующее, но запрос возвращает нулевые строки.

declare @str varchar(50) 
select @str = '''a''' + ',' + '''b'''+ ',' + '''c''' 
select * 
from table1 
where col1 in (@str) 

@str имеет значение 'A', 'B', 'C', но по какой-то причине, SQL Server не распознает его. Как создать строку и сохранить ее в переменной, которая работает с ключевым словом?

+0

, что это/результат: «a», «b», «c» - один и только один varchar, а не 3 – Fredou

+0

возможный дубликат [Параметризация предложения SQL IN] (http://stackoverflow.com/questions/337704/parameterize -a-sql-in-clause) – Dai

ответ

0

Конструкция IN в SQL как набор поиска, а не поиск строки. Ваше единственное строковое значение «a», «b», «c» - это именно то, что он ищет, когда вы говорите, где col1 in (@str) ... как упоминал Фреди в комментариях.

Вместо этого вы хотите передать в набор значений, используя табличную переменную (или временную таблицу):

declare @tabIn table (val varchar(10)) 
insert @tabIn 
    (val) values 
    ('a'), ('b'), ('c') 

select * 
    from table1 
    where 
     col1 in (select val from @tabIn) 

или, в качестве альтернативы, просто сделать прямо присоединиться:

declare @tabIn table (val varchar(10)) 
    insert @tabIn 
     (val) values 
     ('a'), ('b'), ('c') 

select * 
    from table1 t1 
    join @tabIn t2 on 
     t1.col1 = t2.val 
+0

Спасибо, Крис. Работала отлично. – JimG

0

Можно создать строку со встроенными кавычками. Как упоминал Fredou и ChrisS, @str считается одной строкой. Если значение @str конкатенируется с остальной частью вашего оператора select и затем выполняется, вы достигнете желаемых результатов. SQL Fiddle example.

declare @str varchar(50) 
declare @sql varchar(MAX) 

select @str = '''a''' + ',' + '''b'''+ ',' + '''c'''  

Select @sql = 'SELECT * FROM table1 WHERE col1 IN (' + @str + ')' 

Exec(@sql) 

Результаты использования @str = '' 'а' '' + '' + '' 'B' '' + '' + '' 'C' ''

enter image description here


Результаты использования @str = '' 'а' '' + '' + '' 'B' ''

enter image description here

+0

Привет @JimG, если этот или любой ответ решил ваш вопрос, пожалуйста, рассмотрите [принятие это] (http://meta.stackexchange.com/q/5234/179419), щелкнув галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – WorkSmarter

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