1
DECLARE @Versions table (id int); 

INSERT INTO @Versions 
    SELECT DISTINCT Version_Id 
    FROM dbo.values 
    WHERE CatId = (SELECT id FROM dbo.Category WHERE Name = 'Locations') 

SELECT * FROM @Versions --- returns 1,2 

到此为止,我能够获取版本的数据并将其存储在表值参数版本中。但现在我需要遍历它来执行像如何在SQL Server中存储数组值并对其进行迭代

WHILE(till @Versions has value) -- Iterate till @Versions exhausts its value ,which will be ideally 1,2 then stop iteration 
    BEGIN 
     -- Update Statements for each version 
    END 

一些操作如何指定将只运行至@Versions病情值(增量 - 对于版本1执行一些更新,然后做同样为V2,然后退出)

也请建议是否有更好的方法来做到这一点!

+0

你已经采取了看看在SQL服务器游标?它们是在一个集合上声明的,并可用于将值提取到一个或多个变量中。只要光标集中有记录,您就可以设置一个while循环。如果你想解决没有游标的可能的解决方案取决于你想要做什么。除非您的游标用于定义要执行的动态sql,否则通常是可能的。 –

回答

1

您可以使用ROW_NUMBER为如下:

;WITH CTE 
AS 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RowId FROM @Versions 
) 

DECLARE @Counter INT 
SELECT @Counter = COUNT(*) FROM CTE 

WHILE(@Counter != 0) -- Iterate till @Versions exhausts its value ,which will be ideally 1,2 then stop iteration 
    BEGIN 

    -- Current Version 
    SELECT * FROM CTE 
    WHERE RowId = @Counter 

    -- Update Statements for each version 

    SET @Counter -= 1 

    END 

或者你可以使用EXISTS

WHILE(EXISTS(SELECT 1 FROM @Versions)) -- Iterate till @Versions exhausts its value ,which will be ideally 1,2 then stop iteration 
BEGIN 
    -- Update Statements for each version 

    -- After update operation 
    DELETE FROM @Versions 
    WHERE Id = @CurrentVersionId 
END 
相关问题