我的一个变量在while循环中没有正确更新时遇到问题。我正在使用Microsoft SQL Server Management Studio 2012。
use database
declare @sumPrice decimal(10,2) = 0.0
declare @rowPrice decimal(10,2) = 0.0
declare @numRows int = (select count(*) from Products)
declare @iterator int = 1
while @iterator <= @numRows
begin
set @rowPrice = (select UnitPrice from Products p
where p.ProductID = @iterator and UnitsInStock > 110)
set @sumPrice += @rowPrice
set @iterator += 1
end
Print 'The sum is ' + convert(varchar, @sumPrice, 1)
go
问题是@sumPrice永远不会更新。 @iterator得到了很好的更新,到了最后,它的77.在调试代码时,@ runPrice更新到当前行的价格,但是当它到了将它添加到@sumPrice的时候,它永远不会发生。 @sumPrice对于整个循环保持空白,并且print语句甚至不打印。我该如何解决这个问题?
编辑:找到了解决问题的解决方案,结果将NULL添加到变量中导致变量返回NULL。而不是直接添加到变量,您需要使用合并函数。
答案 0 :(得分:1)
@sumprice
以NULL
值开头。向NULL
值添加任何内容都会返回NULL
。
这很容易解决。在循环之前初始化值:
set @sumprice = 0;
在循环之前。
或者,将增量调整为:
set @sumPrice = coalesce(@sumPrice, 0) + @rowPrice;
为安全起见,您应该确保@rowPrice
也不是NULL
:
set @sumPrice = coalesce(@sumPrice, 0) + coalesce(@rowPrice, 0);
如果@rowPrice
即使是一次迭代也是NULL
,那么您将失去该值。
答案 1 :(得分:1)
它不起作用的原因是因为当UnitsInStock不大于110时,内部查询为p.ProductID返回null。将NULL与实数值相加,得到NULL。解决方法是COALESCE NULL。您还需要设置已修复的变量值。
while @iterator <= @numRows
begin
set @rowPrice = (SELECT COALESCE((select UnitPrice
from Products p
where p.ProductID = @iterator and UnitsInStock > 110
), 0)
)
set @sumPrice += @rowPrice
set @iterator += 1
end
SELECT 'The sum is ' + CAST(@sumPrice as varchar)