2015-05-22 6 views
1
SELECT * FROM MyTable WHERE MyRow IN ('100','200','300') 

Попытка сделать выше, объявляя локальную переменную так:Как объявить строку строк?

DECLARE @What VARCHAR(MAX) 
SET @What = '100','200','300' 
SELECT * FROM MyTable WHERE MyRow IN (@What) 

Есть ли способ, чтобы сделать эту работу? У «пытались» это:

SET @What = "'100','200','300'" 

и это:

SET @What = ('100','200','300') 

Первый из них является наиболее логичным, так как он в большинстве случаев могут быть использованы на любом другом языке, кроме SQL. Длина @What будет варьироваться, поэтому я не могу просто иметь одну переменную для каждой.

Как объявить локальную строковую переменную содержать строки?

+0

«как это в большинстве случаев могут быть использованы в любом другом языке, но SQL» на самом деле? Можете ли вы назвать любой другой язык, на котором система проверит содержимое параметра * single * string, найдет запятые внутри и решит вместо этого превратить его в * несколько параметров *? Я не знаю, как это происходит. На таком языке, как вы передаете ему параметр, где запятая является законной частью параметра? –

+0

Я говорю о наличии строк с одинарными кавычками внутри строки с двойными кавычками. В SQL двойные кавычки отсутствуют. – Espen

ответ

4

Вот один из способов сделать это, с табличной переменной:

DECLARE @What TABLE(txt VARCHAR(MAX)) 
INSERT INTO @What (txt) VALUES ('100'),('200'),('300') 
SELECT * FROM MyTable WHERE MyRow IN (SELECT txt FROM @What) 

Вот a sqlfiddle продемонстрировать выше.

0

Я думаю, было бы лучше, если бы вы передали свой список как разделенный запятой список, а затем преобразовали его в таблицу. Вот рабочий пример:

DECLARE @What VARCHAR(MAX) = '100,200,300'; 
DECLARE @XmlData AS XML = CAST(('<X>' + REPLACE(@What, ',', '</X><X>')+'</X>') AS XML); 
DECLARE @Test TABLE (What INT); 


INSERT INTO @Test 
SELECT N.value('.', 'INT') FROM @XmlData.nodes('X') AS T(N); 

SELECT * 
FROM MyTable AS M 
WHERE EXISTS (
    SELECT 1 
    FROM @Test AS T 
    WHERE T.What = M.MyRow 
    ); 
0

Вы можете написать как:

DECLARE @MyTable TABLE (MyRow VARCHAR(MAX)) 
INSERT INTO @MyTable VALUES ('100'),('200'),('300') 


DECLARE @What VARCHAR(MAX) 
SET @What = '100,200,300' 

declare @xml xml 

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

SELECT * FROM @MyTable WHERE MyRow IN 
(
select 
    t.value('.','varchar(max)') as [MyRow items] 
from @xml.nodes('//root/r') as a(t) 
) 
Смежные вопросы