Sql server 2012 SQL Server:为什么向变量添加null不会导致错误?
我有一个存储过程,它有一个基于计数器的循环。当计数器变为NULL时,循环结束,没有任何错误。为什么SQL Server不像其他编程语言那样至少显示警告或错误消息 下面是显示问题的代码示例: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
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);