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

时间:2018-02-17 23:14:26

标签: sql sql-server tsql sql-server-2016

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联机丛书。

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

id

这假设MyTableTypeId始终为正。

由于--prod是标识列,因此您无需插入标识列。您可以在插入时指定所需的列。