SQL Server:为什么在变量中添加null不会导致错误?

时间:2015-04-08 17:51:55

标签: sql-server-2012

我有一个存储过程,它有一个基于计数器的循环。当计数器变为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

1 个答案:

答案 0 :(得分:1)

它不会引发错误,因为这是定义的,记录在案的行为。

如果你有两个苹果并且你知道它们的重量只有一个,那么它们两者的重量加在一起是不合理的。

如果稍微改变配方,您实际上可以收到警告。 而不是

SET @MasterCount += @Count;

您可以使用

SELECT @MasterCount = SUM(C)
FROM   (VALUES(@Count),
              (@MasterCount )) V(C); 

在哪种情况下,它给出了

  

警告:聚合或其他SET消除了空值   操作

然而,这确实改变了语义。由于空值完全被忽略,您最终只需将@MasterCount分配回其原始值,而不是在您的方案中设置为null