【问题标题】:How do I create a filtered index on a table type in SQL Server?如何在 SQL Server 中的表类型上创建筛选索引?
【发布时间】:2018-02-17 23:14:26
【问题描述】:
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 中执行此操作的新方法是什么?我一直遇到以下错误

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

【问题讨论】:

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


    【解决方案1】:

    来自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 
    )
    

    我认为您不能添加类似于以下内容的忽略 NULLS 选项:

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

    【讨论】:

    • 这也差不多。不幸的是,表类型不允许命名索引,这会造成问题。我可能需要对我的问题采取不同的方法。
    • @Matt 我同意这一点。祝你好运
    【解决方案2】:

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

    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 是一个标识列,所以不需要插入其中。你可以在插入时指定你想要的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多