SQL Server 2008:WHILE循环不会迭代每一行

时间:2015-02-04 16:02:50

标签: sql sql-server-2008

我有一个使用while循环的存储过程。它应该读取每条记录并给出结果。我有6条记录是正确的,但是它打印了第6条记录的结果6次。

DECLARE @num_month float, @RowCount int, @Init int

--Get count of SubrowID
SET @RowCount = (SELECT COUNT(SubrowID) 
                 FROM   tblSubrow
                 WHERE SubrowID = 13)

SET @Init = 1

--Iterate each SubrowID
WHILE (@Init <= @RowCount)
BEGIN
    SELECT 
        @num_month = SUBSTRING(CAST(DATEDIFF(DAY, s.StartDate, s.EndDate) * CAST(10 AS float) / CAST(30 AS float) / CAST(10 AS float) AS VARCHAR(10)), (CHARINDEX('.', DATEDIFF(DAY, s.StartDate, s.EndDate) * CAST(10 AS float) / CAST(30 AS float) / CAST(10 AS float), 1)), 2)
    FROM   
       tblSubrow  
    WHERE  
       SubrowID = '13'

    print @num_month

    SET @Init = @Init + 1
END

2 个答案:

答案 0 :(得分:0)

您没有在循环中编写的查询中使用循环变量@Init。我认为你希望它表现得像一个Cursor,一旦循环运行就会自动移动记录,没有这样的事情。

您应该找到一种方法来根据您在循环中收到的值来查询表。或者编写查询以每次获取Top 1值,将其放入临时表中并在查询中包含NOT IN子句以查找并获取临时表中不存在的最高值(即已取出已取出) 。

答案 1 :(得分:0)

你的WHILE循环选择总是会返回6行,你的@num_month变量最终会被设置为最后一个结果行,在这种情况下是第6行。

我不确定您的要求以及为什么需要在WHILE循环中包含它。

使用结果集来填充表变量:

假设

    下面的
  1. [tblSubrowRowid]是表的主键,[tblSubrow]。
  2. s.StartDate和s.EndDate是[tblSubrow]中的列。 (你没有别名[tblSubrow]。)
  3. 您的num_month计算由您的要求决定,因为这不是您所询问的。

    DECLARE @updateTable AS TABLE ( [rowid] INT, [num_month] FLOAT );
    INSERT INTO @updateTable
        ( [rowid], [num_month] )
    SELECT 
        [tblSubrowRowid], SUBSTRING(CAST(DATEDIFF(DAY, [StartDate], [EndDate]) * CAST(10 AS float) / CAST(30 AS float) / CAST(10 AS float) AS VARCHAR(10)), (CHARINDEX('.', DATEDIFF(DAY, [StartDate], [EndDate]) * CAST(10 AS float) / CAST(30 AS float) / CAST(10 AS float), 1)), 2)
    FROM   
       [tblSubrow]
    WHERE  
       SubrowID = '13';
    
  4. 然后您可以使用@updateTable中的数据根据​​需要更新[tblSubrow]或其他表格。

    永远记住,SQL是基于集合的,最好以这种方式使用它。

相关问题