我可以循环一个select语句列表吗?

时间:2016-12-28 09:10:26

标签: sql sql-server tsql

我想通过产品列表循环,其中列表是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为@i的产品。但我想我可以创建一个活动产品列表,而不是将AND p.Active = 1添加到BEGIN END部分的所有语句中。这适用于使用Microsoft SQL Server Management Studio的Microsoft SQL Server。

1 个答案:

答案 0 :(得分: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.您可以使用游标循环选择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