【问题标题】:How to store array of values in SQL Server and iterate over it如何在 SQL Server 中存储值数组并对其进行迭代
【发布时间】:2016-09-26 10:10:17
【问题描述】:
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

到目前为止,我能够获取版本的数据并将其存储在表值参数版本中。但现在我需要对其进行迭代以执行一些操作,例如

    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 执行相同操作,然后退出)

如果有更好的方法,请提出建议!

【问题讨论】:

  • 你看过sql server中的游标了吗?它们在一组上声明,可用于将值提取到一个或多个变量中。您可以设置一个 while 循环,只要游标集中还有记录,该循环就会运行。如果您想在没有游标的情况下求解,可能的解决方案取决于您要执行的操作。除非您的游标用于定义要执行的动态 sql,否则通常是可能的。

标签: sql-server tsql sql-server-2008-r2 table-valued-parameters


【解决方案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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2020-05-30
    • 2010-10-23
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多