2016-12-28 73 views
0

我想通過產品清單循環,清單是SELECT聲明。現在,它只是一個INT變量遞增:我可以循環選擇語句的列表嗎?

DECLARE @i INT 
SELECT @i = 0 

WHILE(@i < 100) 
BEGIN 
    ... 

    SET @i = @i + 1 
END 

這不是我想要的。我如何修改這個讓@i是一個語句的元素,沿(僞ISH)線的東西:

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

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

BEGIN END節拉出這一點,並與一對夫婦的陳述的幾行從第一個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 聲明變量表有額外的標識列,然後循環該 變量表,如果有任何數據。

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.您可以通過標識使用遊標循環從您的選擇 聲明。

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