我有一个使用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
答案 0 :(得分:0)
您没有在循环中编写的查询中使用循环变量@Init。我认为你希望它表现得像一个Cursor,一旦循环运行就会自动移动记录,没有这样的事情。
您应该找到一种方法来根据您在循环中收到的值来查询表。或者编写查询以每次获取Top 1值,将其放入临时表中并在查询中包含NOT IN子句以查找并获取临时表中不存在的最高值(即已取出已取出) 。
答案 1 :(得分:0)
你的WHILE循环选择总是会返回6行,你的@num_month变量最终会被设置为最后一个结果行,在这种情况下是第6行。
我不确定您的要求以及为什么需要在WHILE循环中包含它。
使用结果集来填充表变量:
假设
您的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';
然后您可以使用@updateTable中的数据根据需要更新[tblSubrow]或其他表格。
永远记住,SQL是基于集合的,最好以这种方式使用它。