我有一个存储过程,它有一个基于计数器的循环。当计数器变为NULL时,循环结束而没有任何错误。为什么SQL Server至少不会像其他编程语言一样显示警告或错误消息?
以下是展示问题的代码示例:
DECLARE @MasterCount int = 0;
DECLARE @Count int; -- initialized to NULL by SQL Server
PRINT 'Starting'
IF (@MasterCount IS NULL)
PRINT '@MasterCount IS NULL';
ELSE
PRINT '@MasterCount ' + CAST(@MasterCount AS varchar(10))
IF (@Count IS NULL)
PRINT '@Count IS NULL';
WHILE (@MasterCount IS NOT NULL)
BEGIN
SET @MasterCount += @Count;
IF @@ERROR <> 0 PRINT 'Error occured!'
PRINT 'Loop @Count ' + CAST(@Count AS varchar(10))
SET @Count -= 1;
END
IF @@ERROR <> 0 PRINT 'Error occured!'
IF (@MasterCount IS NULL)
PRINT '@MasterCount IS NULL';
ELSE
PRINT '@MasterCount ' + CAST(@MasterCount AS varchar(10))
PRINT 'Ending'
产生以下输出:
Starting
@MasterCount 0
@Count IS NULL
@MasterCount IS NULL
Ending
答案 0 :(得分:1)
它不会引发错误,因为这是定义的,记录在案的行为。
如果你有两个苹果并且你知道它们的重量只有一个,那么它们两者的重量加在一起是不合理的。
如果稍微改变配方,您实际上可以收到警告。 而不是
SET @MasterCount += @Count;
您可以使用
SELECT @MasterCount = SUM(C)
FROM (VALUES(@Count),
(@MasterCount )) V(C);
在哪种情况下,它给出了
警告:聚合或其他SET消除了空值 操作
然而,这确实改变了语义。由于空值完全被忽略,您最终只需将@MasterCount
分配回其原始值,而不是在您的方案中设置为null
。