2016-12-28 6 views
0

私はリストがSELECTステートメントである製品のリストをループしたいと思います。今、それをインクリメントするだけINT変数です:select文のリストをループすることはできますか?

DECLARE @i INT 
SELECT @i = 0 

WHILE(@i < 100) 
BEGIN 
    ... 

    SET @i = @i + 1 
END 

これは私が欲しいものではありません。

DECLARE @ids List<INT> 
SELECT @ids = (SELECT p.Id FROM Products p WHERE p.Active = 1) 

FOR(@id in @ids) 
BEGIN 
    ... 
END 

BEGIN ENDセクションでは、これとそれとの文の数行のカップル引き出している:@iは、(擬似っぽい)の線に沿って何かの文の要素であるように、どのように私はこれを変更することができます最初から@iのIDを持つ製品。しかし、BEGIN ENDセクションのすべてのステートメントにAND p.Active = 1を追加するのではなく、アクティブな製品のリストを作成できると考えました。これは、Microsoft SQL Server Management Studioを使用するMicrosoft SQL Server用です。

+1

どのデータベースが違反ですか? SQL Server、MySQL、その他何か?例えばSQL Serverにはカーソルがあります。カーソルは、あなたが望むことを行えるようにします(私は思っています)。 – MarcinJuraszek

+0

使用しているdbmsにタグを付けます。このコードは、ANSI SQLに準拠していません。 – jarlh

+0

DBMSにタグを付けてください。 – McNets

答えて

1

下記の2つのオプションを試してください。何か問題が発生した場合はお知らせください。

任意のデータがある場合はオプション1 がループそして、この 変数テーブルを余分にID列を持つ変数テーブルを宣言します。

DECLARE @VarTable TABLE (ORDER_ID int IDENTITY(1,1), ID INT not null) 
INSERT INTO @VarTable 
SELECT p.Id 
FROM Products p 
WHERE p.Active = 1 

DECLARE @order_id int = 1 
DECLARE @max_order_id int = (SELECT ISNULL(MAX(ORDER_ID),0) FROM @VarTable) 
WHILE (@order_id <= @max_order_id) 
BEGIN 
    -- do your stuff 
    SET @order_id = @order_id + 1 
END 

オプション2.あなたはあなたの選択 のステートメントからのIDをループにカーソルを使用することができます。

DECLARE @ID INT 

DECLARE CRS_CURSOR CURSOR FOR 
SELECT P.Id 
FROM Products P 
WHERE P.Active = 1 

OPEN CRS_CURSOR 

FETCH NEXT FROM CRS_CURSOR INTO @ID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    -- below line to test only 
    SELECT @ID AS CurrentID 
    -- do your stuff based on current @ID 

    FETCH NEXT FROM CRS_CURSOR INTO @ID 
END 

CLOSE CRS_CURSOR 
DEALLOCATE CRS_CURSOR 
+0

@fUrious。どのオプションを選んだのですか? – PawelCz

関連する問題