SQL变量未正确更新

时间:2017-11-04 22:17:11

标签: sql tsql sql-server-2012

我的一个变量在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。而不是直接添加到变量,您需要使用合并函数。

2 个答案:

答案 0 :(得分:1)

@sumpriceNULL值开头。向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)