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

问题描述 投票:2回答:2
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 
)

在SQL Server 2016中执行此操作的新方法是什么?我一直遇到以下错误

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

sql sql-server tsql sql-server-2016
2个回答
2
投票

从这个Microsoft Article

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

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

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

我不认为您可以添加类似于以下内容的Ignore NULLS选项:

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(yourcolumn)
WHERE yourcolumn IS NOT NULL;

1
投票

这有点复杂,但如果您愿意添加另一列,那么您可以这样做:

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)
);

这假设id总是积极的。

因为MyTableTypeId是一个标识列,所以您不需要插入它。您可以在执行插入时指定所需的列。

© www.soinside.com 2019 - 2024. All rights reserved.