我最近在演示中看到了这个例子。当您运行这样的查询时:
SELECT COUNT(NULL)
您收到以下错误:
操作数数据类型NULL对计数运算符无效。
运行此命令时:
SELECT COUNT(1/NULL)
即使除法结果本身为NULL,结果还是为0。如果交换1和NULL,也会发生同样的情况。
但是,如果您这样做:
SELECT COUNT(NULL/NULL)
您再次遇到与第一个查询相同的错误(除法本身是合法的,产生NULL)。
谁能解释sql server如何提供此类结果?
答案 0 :(得分:7)
在SQL Server中,某些聚合函数(例如COUNT,MIN,MAX)和函数(例如DATEADD)需要数据类型。 NULL
本身没有一个,因此会给您一个错误:
SELECT COUNT(NULL) -- Operand data type NULL is invalid for count operator.
与之类似:
SELECT COUNT(NULL/NULL)
对于1/NULL
,数据类型为INT,值为NULL,因此可以正常工作:
SELECT COUNT(1/NULL) -- 0
与之类似:
SELECT COUNT(CAST(NULL AS INT)) -- 0
答案 1 :(得分:1)
这实际上是编译器错误。当您运行批处理时,将分析T-SQL,并在 而非执行时绘制语句SELECT COUNT(NULL);
和SELECT COUNT(NULL/NULL);
的错误。 / p>
如果您在下面运行该批处理,您将很快看到:
PRINT 'testing 1'
SELECT COUNT(NULL); --Error at compile
GO
PRINT 'testing 2'
SELECT COUNT(1/NULL); --Runs
GO
PRINT 'testing 3'
SELECT COUNT(NULL/NULL); --Error at compile
GO
PRINT 'testing 4'
SELECT COUNT(0/0); --Error at run time
请注意,testing 1
和testing 3
语句永远不会出现。
值NULL
本身没有数据类型。表达式的所有边均为NULL
的表达式实际上将具有未知的数据类型。
如果要为NULL
设置数据类型,则不会发生此问题:
PRINT 'testing 5'
SELECT COUNT(CONVERT(int,NULL));
GO
PRINT 'testing 6'
DECLARE @N int;
SELECT COUNT(@N);
答案 2 :(得分:0)
问题在于所涉及的数据类型。如果运行以下命令,我们可以看到仅NULL没有数据类型:
SELECT SQL_VARIANT_PROPERTY(NULL,'BaseType')
与您看到的错误相对应。
我们可以使用强制转换将NULL设置为选定的数据类型,在这种情况下,错误将得到解决:
SELECT COUNT(cast(NULL as int))