2016-05-31 14 views
0

Ich habe 6 Variablen in einer gespeicherten Prozedur deklariert und ich möchte ein Abfrageergebnis (das bis zu 6 Datensätze bringen kann) in jede dieser Variablen speichern. Meine Abfrage sieht wie folgt aus:Speichern Query Ergebnis in Variable

DECLARE 
    @Sib1 varchar(20), 
    @Sib2 varchar(20), 
    @Sib3 varchar(20), 
    @Sib4 varchar(20), 
    @Sib5 varchar(20), 
    @Sib6 varchar(20) 

select 
    PC.SKU 
from 
    Product PC 
    where 
     Parent_code in (select 
            Parent_code 
           from 
            Product 
           where 
            SKU =12345) 
     and ParentFlag <> 'p' 
     and SKU <> 12345 
order by Parent_Child_Priority desc 

ich jeden der resultierenden SKU in jeder @SIB Variablen setzen möchten. Wenn es nur 1 Ergebnis zurückgibt, möchte ich Null-Werte in den Rest der @ SIB-Variablen setzen.

Danke.

+2

Warum eine temporäre Tabelle nicht stattdessen verwenden? Es wird sehr schwierig sein, solche Variablen zu verwenden. –

+1

Denken Sie in Bezug auf Datensätze im Design relationaler Datenbanken, nicht in Zeilen/Datensätzen. – xQbert

+0

Mein Ziel ist es, diese resultierenden SKUs in einer anderen Abfrage in where-Klausel zu verwenden. Deshalb versuche ich, diese in einer Variablen zu speichern und sie später zu verwenden. Irgendwelche anderen Vorschläge? – Eclipse

Antwort

2

Sie können die SKUs in eine Tabellenvariable mit einer Identitätsspalte einfügen. Setzen Sie dann die Variablen auf der Grundlage des Werts der Identitätsspalten auf den Sku in der Tabelle.

DECLARE @Sib1 VARCHAR(20) 
    ,@Sib2 VARCHAR(20) 
    ,@Sib3 VARCHAR(20) 
    ,@Sib4 VARCHAR(20) 
    ,@Sib5 VARCHAR(20) 
    ,@Sib6 VARCHAR(20); 

DECLARE @TempTbl TABLE (
    RowID INT IDENTITY 
    ,SKU VARCHAR(20) 
    ) 

INSERT INTO @TempTbl (SKU) 
select 
    PC.SKU 
from 
    Product PC 
    where 
     Parent_code in (select 
            Parent_code 
           from 
            Product 
           where 
            SKU =12345) 
     and ParentFlag <> 'p' 
     and SKU <> 12345 
order by Parent_Child_Priority desc 

SELECT @Sib1 = SKU 
FROM @TempTbl 
WHERE RowID = 1; 

SELECT @Sib2 = SKU 
FROM @TempTbl 
WHERE RowID = 2; 

SELECT @Sib3 = SKU 
FROM @TempTbl 
WHERE RowID = 3; 

SELECT @Sib4 = SKU 
FROM @TempTbl 
WHERE RowID = 4; 

SELECT @Sib5 = SKU 
FROM @TempTbl 
WHERE RowID = 5; 

SELECT @Sib6 = SKU 
FROM @TempTbl 
WHERE RowID = 6; 

EDIT

DECLARE @SQL VARCHAR(MAX); 

SET @SQL = 'SELECT SKU, ..., sum(convert(INT, a.qty)) AS ' + @sib1 + ' FROM ...' 
EXEC (@SQL); 
+0

Dies funktioniert. Wenn ich @ sib1 als Spaltennamen in einer anderen Abfrage verwenden möchte, verwende ich dynamic sql? Wenn ja, bitte ein Beispiel. Ich versuche, eine Abfrage etwas wie sqltext = 'wählen SKU, ....., sum (konvertieren (int, a.qty)) als' + SIB1 + '.... aber das gibt mir einen Fehler im as '+ SIB1 +' Teil. Dieser Kommentar lässt mich nicht das at-Symbol verwenden, aber SIB1 und sqltest sind Variablen mit at-Zeichen – Eclipse

+0

@Eclipse - Sie sollten in der Lage sein, etwas in dem Abschnitt "EDIT" zu tun, den ich gerade hinzugefügt habe. – TLaV

+0

Tim, Wenn meine Abfrage nicht 6 Zeilen zurückgibt und nur 1 Zeile zurückgibt, wären die Variablen sib2-sib6 leer. das führt dazu, dass meine andere Abfrage fehlschlägt! irgendeine Lösung dafür? – Eclipse

1

Vielmehr verwenden ein table variable wie

DECLARE @MyTableVar table(
    SKU int NOT NULL); 

Dann legen hinein

insert into @MyTableVar(SKU) 
select 
    PC.SKU 
from 
    Product PC 
    where 
     Parent_code in (select 
            Parent_code 
           from 
            Product 
           where 
            SKU =12345) 
     and ParentFlag <> 'p' 
     and SKU <> 12345 
order by Parent_Child_Priority desc; 

Jetzt können Sie verwenden, dass @MyTableVar wie Sie benötigen. Sie müssen die N Variable für N Datensätze nicht deklarieren.