为何WHERE条件不成立时@@ROWCOUNT仍返回1且@b=1?
这个问题其实是SQL Server里聚合查询的一个典型特性,我来给你拆解清楚:
首先先把你的代码贴出来方便分析:
declare @a int, @b int select @a=sum(1), @b=1 from syscolumns where 1 = 2 select @@rowcount, @a, @b
为什么@b=1?
当SELECT语句里包含聚合函数(比如这里的SUM)时,哪怕WHERE条件过滤掉了所有匹配行,SQL Server也不会返回0行,而是会生成一行聚合结果——这一行里,聚合函数的计算结果是NULL,但其他非聚合的赋值(比如@b=1)会正常执行。
简单说,带聚合函数的查询默认会保证至少返回一行,所以@b=1这个赋值会被触发,变量@b就被设置成了1。如果把SUM去掉,改成select @b=1 from syscolumns where 1=2,这时候没有聚合函数,查询返回0行,@b就不会被赋值,会保持初始的NULL状态。
为什么@@ROWCOUNT=1?
@@ROWCOUNT的作用是返回上一个语句实际返回的行数。刚才已经解释了,带SUM的那个SELECT语句返回了1行(聚合后的空结果行),所以@@ROWCOUNT自然就是1。要是没有聚合函数,那个SELECT返回0行,@@ROWCOUNT就会是0。
为什么@a=NULL?
这个你理解的没错,SUM(1)在没有任何行参与计算时,结果就是NULL,所以@a被赋值为NULL。
内容的提问来源于stack exchange,提问作者EagerToLearn
相关产品推荐
相关产品推荐

