Sql server nvarchar(200)稀疏空列上的(TSQL)唯一索引

Sql server nvarchar(200)稀疏空列上的(TSQL)唯一索引,sql-server,tsql,Sql Server,Tsql,我面临一个令人困惑的问题。如果创建如下所示的表,则会出现错误: CREATE TABLE t ( a NVARCHAR(100) SPARSE NULL UNIQUE ) Msg 1919, Level 16, State 2, Line 1 Column 'a' in table 't' is of a type that is invalid for use as a key column in an index. Msg 1750, Level 16,

我面临一个令人困惑的问题。如果创建如下所示的表,则会出现错误:

CREATE TABLE t
(
 a NVARCHAR(100) SPARSE
                 NULL UNIQUE
)

Msg 1919, Level 16, State 2, Line 1
Column 'a' in table 't' is of a type that is invalid for use as a key column in an index.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.
但是如果您先创建表,然后像这样创建唯一索引,那么一切都会正常工作

CREATE TABLE t
(

 a NVARCHAR(100) SPARSE
                 NULL
)

CREATE UNIQUE NONCLUSTERED INDEX t_a ON dbo.t
(
a
)
有人能帮我解释一下吗


谢谢大家!

您正在尝试这样做,但是:

CREATE TABLE t 
( 
     a NVARCHAR(100) SPARSE NULL 
         CONSTRAINT t_a UNIQUE NONCLUSTERED (a)
) 
…无法在具有许多空值的列上创建唯一索引。为此,您需要创建一个过滤索引。i、 e

CREATE NONCLUSTERED INDEX t_a ON dbo.t(a) 
WHERE a IS NOT NULL

很奇怪,您可以在单独的语句中创建索引,但不能在表create中创建索引

原因可能是在稀疏列上创建唯一索引没有多大意义。稀疏列的整个要点是高效地存储
null
,唯一索引只允许一行
null

insert t values (null)
insert t values (null)
-->

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.t' with unique index 't_a'.
The statement has been terminated.

我不知道为什么,但是从

稀疏列不能是聚集索引或唯一主键索引的一部分

现在,进入猜测之地

这有点道理,因为唯一约束不能被过滤,而显式索引可以。因此,不允许使用唯一约束,但可以通过创建索引(其中包含隐含筛选器)来使用该约束

我还要说不允许使用聚集索引,因为每个非聚集索引都引用聚集索引+聚集索引必须是内部唯一的,如果不是显式的(“uniquifier”)。所以每一行都必须存在

综上所述,你必须要有一些独特的和/或集群的东西:这会挫败使用稀疏。。。没有