如何在SQL Server中存储数组值并对其进行迭代
问题描述:
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,然后退出)
也请建议是否有更好的方法来做到这一点!
答
您可以使用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
你已经采取了看看在SQL服务器游标?它们是在一个集合上声明的,并可用于将值提取到一个或多个变量中。只要光标集中有记录,您就可以设置一个while循环。如果你想解决没有游标的可能的解决方案取决于你想要做什么。除非您的游标用于定义要执行的动态sql,否则通常是可能的。 –