2011-01-18 3 views
0

Comment faire en sorte que l'instruction SQL suivante fasse partie du "SET" dans ma requête? Je veux sortir une liste dans une colonne et avoir mon "SET" courir contre cela. De cette façon, mon "SET" n'est pas juste une variable mais plutôt une liste à exécuter. Logique?SQL Set Question

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

Je veux utiliser quelque chose comme ce qui suit pour avoir requête contre au lieu du 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' 

Répondre

2

ÉDITÉ: Basé sur les commentaires de Asker

J'ai remarqué que vous écrivez explicitement le code article (ou ID, tout ce que vous voulez l'appeler). Si vous avez une liste statique de codes qui ne peuvent pas être facilement récupéré à partir de votre base de données, vous pouvez faire quelque chose comme ceci:

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

Par ailleurs, si cette liste de codes peut être saisi facilement:

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

ensuite, vous pouvez utiliser la variable comme une table normale:

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 essayant d'exécuter ceci: sélectionnez a.t_sitm comme StartItem , a.t_mitm , a.t_sitm , b.t_ctyp , a.t_qana de ttibom010101 comme INNER JOIN ttiitm001101 comme b sur a.t_sitm = b.t_item où b.t_ctyp! = 'TOP' et b.t_ctyp! = 'SUB' et a.t_sitm = @ Articles – GabrielVa

+0

Je suppose que ce que je veux dire, c'est que voulez-vous réellement faire avec les résultats de cette requête. Par exemple, vous avez exécuté la requête d'origine et vous disposez désormais d'une liste de valeurs de a.t_sitm correspondant à vos conditions. Qu'essayez-vous de faire avec ces valeurs? – Jason

+0

Ah. Gotcha, désolé. Je prévois de les placer dans une table temporaire afin que je puisse exécuter une requête, puis placer la requête dans une table pour un DataCube. C'est ce que j'ai: 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' 

Notez cela ne fonctionnera correctement que si le wil de requête ne retourne plus qu'un résultat. Si vous pouvez avoir des résultats multipel, déclarez une table varaiable au lieu d'une variable scalaire et insérez-la dans la table varaiable insted, puis utilisez-la comme jointure dans un traitement ultérieur.

0

Vous n'avez pas mentionné quelle saveur de SQL vous utilisiez, mais pouvez-vous utiliser un curseur ou une expression de table commune?

+0

Salut, Im utilisant SQL 2005. – GabrielVa

0

question conjointement avec un commentaire

Im essayant de lancer ceci: sélectionnez a.t_sitm comme StartItem, a.t_mitm, a.t_sitm , b.t_ctyp, a.t_qana de ttibom010101 comme INNER JOIN ttiitm001101 comme b sur a.t_sitm = b .t_item où b.t_ctyp! = 'TOP' et b.t_ctyp! = 'SUB' et a.t_sitm = @ Articles

Si tout ce que vous essayez de faire est le test à une liste, puis utilisez une liste de constantes au lieu d'une variable

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

Si vous essayez de passer une seule chaîne paramètre à SQL Server, alors vous avez besoin d'une fonction pour le diviser en lignes d'une table, d'abord récupérer la fonction dbo.Split d'ici (une des nombreuses fonctions "split" utilisables)

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

Ensuite, vous pouvez utiliser cette requête (sous forme)

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)) 

Ou en REJOIGNEZ-forme

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'