2011-08-10 44 views
9

使用T-SQL的排名函数时,包含排名值的列可以为空。为什么T-SQL排名值返回空列?

创建结果集的视图时,你可以看到这一点:

CREATE VIEW v 
AS 
    SELECT Name 
    , ListPrice 
    , RANK() OVER (ORDER BY ListPrice DESC) AS [Rank] 
    , DENSE_RANK() OVER (ORDER BY ListPrice DESC) AS [DenseRank] 
    , ROW_NUMBER() OVER (ORDER BY ListPrice DESC) AS [RowNumber] 
FROM Production.Product 

此视图下执行sp_help表明,使用排名函数的列是可空:

EXEC sp_help 'v' 

Column_name (...) | Nullable 
---------------...-+------------+ 
...   (...) | ... 
Rank   (...) | Yes 
DenseRank  (...) | Yes 
RowNumber  (...) | Yes 

何种条件将导致排名函数返回NULL

+1

视图中的AFAIK计算列与基表中的计算列没有任何区别。 [关于这个和可空性的一些评论在本页底部。](http://msdn.microsoft.com/en-us/library/ms191250.aspx) –

回答

8

视图中的每个基于计算/函数的列似乎都是可空的。例如: -

create view v1 
as 
    select OBJECT_ID,OBJECT_ID * 1 as obj2 from sys.objects 
go 
EXEC sp_help 'v1' 

表示object_id不能为空但obj2是,即使它是平凡的观察到的,如果object_id不能为空,也不能obj2

我知道的(不知道如果这是你真正需要的),只有这样,才能迫使列似乎不为空,是把它包起来在ISNULL

create view v2 
as 
    select OBJECT_ID,ISNULL(OBJECT_ID * 1,0) as obj2 from sys.objects 
go 
EXEC sp_help 'v2' 

有趣的是,这是少数地方,你不能使用COALESCE,而不是ISNULL之一:

create view v3 
as 
    select OBJECT_ID,COALESCE(OBJECT_ID * 1,0) as obj2 from sys.objects 
go 
EXEC sp_help 'v3' 

v3类似于v1