2016-05-31 9 views
0
変数

に私は、ストアドプロシージャ内の6つの変数を宣言していると私は、これらの変数のそれぞれに(6つのまでのレコードをもたらす可能性があります)クエリの結果を保存したいと思います。私のクエリは次のようになります。ストアクエリ結果は

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 

私は、各@SIB変数に結果としてSKUのそれぞれを置きたいと思います。 1つの結果しか返さない場合は、残りの@SIB変数にnull値を設定したいと思います。

ありがとうございました。

+2

?このような変数を使用することは非常に難しいことです。 –

+1

行/レコードではなく、リレーショナルデータベース設計のデータセットについて考えてみましょう。 – xQbert

+0

私の目標は、結果のSKUをwhere句の別のクエリで使用することです。だから私はこれらを変数に格納して後で使用しようとしています。その他の提案はありますか? – Eclipse

答えて

2

あなたはID列で、SKUのテーブル変数に挿入できます。次に、ID列の値に基づいて表のskuに等しい変数を設定します。

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

これは機能します。 @ sib1を別のクエリで列名として使用する場合は、動的SQLを使用しますか?もしそうなら、例を挙げてください。私は+ SIB1 +」「としてSKU、.....、合計(変換(int型、a.qty))を選択」= SQLTEXTようなクエリ何かをフォーマットしようとしている....が、これは私にエラーを与えています'+ SIB1 +'の部分に表示されます。このコメントは、私は、シンボルが、SIB1に使用せず、SQLTESTはアット – Eclipse

+0

@Eclipseを持つ変数です - あなたは、私が追加した「EDIT」セクションのような何かを行うことができるはず。 – TLaV

+0

Tim、私のクエリで6行が返されず、1行しか返さない場合、変数sib2-sib6は空になります。それは私の他のクエリが失敗する原因です!それに対する解決策はありますか? – Eclipse

1

むしろあなたが必要として今、あなたはその@MyTableVarを使用することができ、それに

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; 

を挿入しtable variable

よう
DECLARE @MyTableVar table(
    SKU int NOT NULL); 

を使用しています。 NレコードにはNという変数を宣言する必要はありません。