我想通过产品列表循环,其中列表是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。
答案 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