2011-01-18 2 views
0

Как я могу сделать следующую инструкцию sql из «SET» в моем запросе? Я хочу вытащить список в столбце и запустить мой «SET». Таким образом, мой «SET» - это не только одна переменная, но и список, с которым нужно работать. Имеет смысл?SQL Set Question

DECLARE @Item as char(32) 
declare @result varchar(max); 
SET @Item = '034100-3JK'; 

Я хочу использовать что-то вроде следующего, чтобы иметь его запрос к вместо 034100-3JK:

select distinct 
     a.t_sitm as StartItem 
from 
     ttibom010101 as a 
     INNER JOIN ttiitm001101 as b on a.t_sitm = b.t_item 
where 
     b.t_ctyp != 'TOP' 
     and b.t_ctyp != 'SUB' 

ответ

2

Редакция: На основе замечаний Аскера

Я заметил, что вы явно выписывая код элемента (или ID, все, что вы хотите назвать его). Если у вас есть статический список кодов, которые не могут быть легко извлекается из базы данных, вы можете сделать что-то вроде этого:

DECLARE @Items TABLE 
(
    item varchar(10) 
) 
INSERT INTO @Items 
VALUES ('034007-3CL'), 
('next_code'), 
('next_next_code') 

В качестве альтернативы, если список кодов могут быть захвачены легко:

DECLARE @Items TABLE 
(
    item varchar(10) 
) 
INSERT INTO @Items 
SELECT a.items 
FROM mytable AS a 
WHERE a.column = condition 

После этого вы можете использовать переменную как обычный стол:

select 
    a.t_sitm as StartItem 
    ,a.t_mitm 
    ,a.t_sitm 
    ,b.t_ctyp 
    ,a.t_qana 
from 
    ttibom010101 as a 
    INNER JOIN ttiitm001101 as b on a.t_sitm = b.t_item 
    INNER JOIN @items as c on a.t_sitm = c.item 
where 
    b.t_ctyp != 'TOP' 
    and b.t_ctyp != 'SUB' 
+0

Im пытается запустить это: выберите a.t_sitm в StartItem , a.t_mitm , a.t_sitm , b.t_ctyp , a.t_qana из ttibom010101 как INNER JOIN ttiitm001101 а б о a.t_sitm = b.t_item где b.t_ctyp! = 'TOP' и b.t_ctyp! = 'SUB' и a.t_sitm = @ Items – GabrielVa

+0

Я предполагаю, что я имею в виду то, что вы на самом деле планируете делать с результатами этого запроса. Например, вы выполнили исходный запрос, и теперь у вас есть список значений из a.t_sitm, которые соответствуют вашим условиям. Что вы пытаетесь сделать с этими ценностями? – Jason

+0

Ах. Гоча, извините. Я планирую положить их в таблицу temp, чтобы я мог запустить запрос, а затем поместить запрос в таблицу для DataCube. Это то, что у меня есть: http://heavenlypulpits.com/testq.txt – GabrielVa

0
DECLARE @Item as char(32) 
select distinct  @Item = a.t_sitm as StartItem 
from   ttibom010101 as a   
INNER JOIN ttiitm001101 as b 
    on a.t_sitm = b.t_item 
where b.t_ctyp != 'TOP' and b.t_ctyp != 'SUB' 

Примечание это будет работать правильно, если Виль запрос не возвращать больше чем один результат. Если вы можете получить множественные результаты, объявите таблицу varaiable вместо скалярного varaible и вставьте в таблицу varaiable insted, а затем используйте ее как объединение в последующей обработке.

0

Вы не указали, какой вкус SQL вы использовали, но можете ли вы использовать курсор или общее табличное выражение?

+0

Привет, я использую SQL 2005. – GabrielVa

0

Вопрос в сочетании с комментарием

Im пытается запустить этот: выберите a.t_sitm в StartItem, a.t_mitm, a.t_sitm , b.t_ctyp, a.t_qana из ttibom010101 как INNER JOIN ttiitm001101 а б о a.t_sitm = Ь .t_item где b.t_ctyp! = 'TOP' и b.t_ctyp! = 'SUB' и a.t_sitm = @ Items

Если все, что вы пытаетесь сделать, это испытание против списка, а затем использовать постоянный список вместо переменной

and a.t_sitm in ('abc','def','ghi') 

Если вы пытаетесь передать одиночную строку параметру SQL Server, тогда вам понадобится функция, чтобы разбить ее на строки таблицы, сначала возьмите функцию dbo.Split отсюда (одна из многих используемых «разделенных» функций)

http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=StringArrayInput

Затем вы можете использовать этот запрос (в форме)

select a.t_sitm as StartItem ,a.t_mitm ,a.t_sitm ,b.t_ctyp ,a.t_qana 
from ttibom010101 as a 
INNER JOIN ttiitm001101 as b on a.t_sitm = b.t_item 
where b.t_ctyp != 'TOP' and b.t_ctyp != 'SUB' 
and a.t_sitm in (select Value from dbo.split(',',@item)) 

Или РЕГИСТРИРУЙТЕСЬ образуют

select a.t_sitm as StartItem ,a.t_mitm ,a.t_sitm ,b.t_ctyp ,a.t_qana 
from ttibom010101 as a 
INNER JOIN ttiitm001101 as b on a.t_sitm = b.t_item 
inner join dbo.split(',',@item) S on S.Value = a.t_sitm 
where b.t_ctyp != 'TOP' and b.t_ctyp != 'SUB'