Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么T-SQL排名值返回可为空的列?_Sql Server_Tsql - Fatal编程技术网

Sql server 为什么T-SQL排名值返回可为空的列?

Sql server 为什么T-SQL排名值返回可为空的列?,sql-server,tsql,Sql Server,Tsql,使用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 ListPri

使用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

视图中的每个计算列/基于函数的列似乎都可以为NULL。例如:

create view v1
as
    select OBJECT_ID,OBJECT_ID * 1 as obj2 from sys.objects
go
EXEC sp_help 'v1'
指示
object\u id
不可为空,但
obj2
可为空,即使可以观察到if
object\u id
永远不能为空,也不能
obj2

我所知道的强制列显示为不可为null的唯一方法(不确定这是否是您真正想要的)是将其包装在
ISNULL
中:

create view v2
as
    select OBJECT_ID,ISNULL(OBJECT_ID * 1,0) as obj2 from sys.objects
go
EXEC sp_help 'v2'
create view v3
as
    select OBJECT_ID,COALESCE(OBJECT_ID * 1,0) as obj2 from sys.objects
go
EXEC sp_help 'v3'
有趣的是,这是少数几个不能使用
COALESCE
而不是
ISNULL
的地方之一:

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

v3
类似于
v1

视图中的AFAIK计算列与基表中的计算列没有任何区别。