Sql server 2012 SQL Server:为什么向变量添加null不会导致错误?

Sql server 2012 SQL Server:为什么向变量添加null不会导致错误?,sql-server-2012,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

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

它不会引发错误,因为这是定义的、有文档记录的行为

如果你有两个苹果,而你只知道其中一个的重量,那么两个苹果加在一起的重量是未知的,这是有道理的

如果您稍微更改公式,实际上会出现警告。 而不是

SET @MasterCount += @Count;
你可以用

SELECT @MasterCount = SUM(C)
FROM   (VALUES(@Count),
              (@MasterCount )) V(C); 
在这种情况下,它给出

警告:聚合或其他集合会消除空值 手术


然而,这确实改变了语义。由于空值被完全忽略,在您的场景中,
@MasterCount
只会被分配回其原始值,而不会被设置为
null

为什么您会期望出现错误?我期望其他编程语言会出现类似的行为,在这些语言中,向数值添加空值是一个错误。我感到奇怪的是,SQL Server并非如此。
NULL+something
等于
NULL
。我看不出有什么问题,真的,“未定义+1”就是“未定义”
SELECT @MasterCount = SUM(C)
FROM   (VALUES(@Count),
              (@MasterCount )) V(C);