如何在SQL Server中为表类型创建筛选索引?

如何在SQL Server中为表类型创建筛选索引?,sql,sql-server,tsql,sql-server-2016,Sql,Sql Server,Tsql,Sql Server 2016,在SQL Server 2016中,有什么新方法可以做到这一点?我一直遇到以下错误 “索引”附近的语法不正确。如果这是作为表提示的一部分,那么现在需要一个WITH关键字和括号。有关正确的语法,请参阅SQL Server联机丛书 由此: 无法在用户定义的表类型上创建非聚集索引,除非该索引是在用户定义的表类型上创建主键或唯一约束的结果。(SQL Server通过使用索引强制执行任何唯一或主键约束。) 我认为为表类型创建唯一索引的唯一方法是: CREATE TYPE [dbo].[MyTableTyp

在SQL Server 2016中,有什么新方法可以做到这一点?我一直遇到以下错误

“索引”附近的语法不正确。如果这是作为表提示的一部分,那么现在需要一个WITH关键字和括号。有关正确的语法,请参阅SQL Server联机丛书

由此:

无法在用户定义的表类型上创建非聚集索引,除非该索引是在用户定义的表类型上创建主键或唯一约束的结果。(SQL Server通过使用索引强制执行任何唯一或主键约束。)

我认为为表类型创建唯一索引的唯一方法是:

CREATE TYPE [dbo].[MyTableType] AS TABLE
(
    Id INT NULL INDEX ix UNIQUE WHERE Id IS NOT NULL /*Unique ignoring nulls*/
    , Sort INT NOT NULL
    , [Name] NVARCHAR(MAX) NULL 
)
我不认为您可以添加类似以下内容的忽略空值选项:

CREATE TYPE [dbo].[MyTableType] AS TABLE
(
    Id INT NULL UNIQUE
    , Sort INT NOT NULL
    , [Name] NVARCHAR(MAX) NULL 
)

这有点复杂,但如果您愿意添加另一列,则可以执行以下操作:

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(yourcolumn)
WHERE yourcolumn IS NOT NULL;
这假设
id
始终为正


因为
MyTableTypeId
是一个标识列,所以您不需要在其中插入。在执行插入操作时,您只需指定所需的列。

这也是我所知道的。不幸的是,表类型不允许命名索引,这就造成了问题。我可能需要采取不同的方法来解决我的问题。@Matt我同意这一点。祝你好运
CREATE TYPE [dbo].[MyTableType] AS TABLE (
    MyTableTypeId int identity(1, 1),
    Id INT NULL,
    Sort INT NOT NULL,
    [Name] NVARCHAR(MAX) NULL,
    _ix as (coalesce(id, - MyTableTypeId)),
    unique (_ix)
);