【问题标题】:Create non-clustered index on the table variable [duplicate]在表变量上创建非聚集索引 [重复]
【发布时间】:2019-07-02 17:18:22
【问题描述】:

如何在下面的表变量上创建非聚集索引?我试过了,但它抛出了一个异常

“@TBL”附近的语法不正确

我的代码:

DECLARE @TBL TABLE(ID INT PRIMARY KEY, FROMDATE DATETIME, TODATE DATETIME)

CREATE NONCLUSTERED INDEX IX_myindex 
ON @TBL (FROMDATE);  

谢谢

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您必须在表定义中声明索引。尽管支持索引(自 SQL Server 2014 起),但 CREATE INDEX 语法不支持表变量。所以:

DECLARE @TBL TABLE (
    ID INT PRIMARY KEY,
    FROMDATE DATETIME,
    TODATE DATETIME,
    INDEX idx_tbl_fromdate (FROMDATE)
);

Here 是一个 dbfiddle。

编辑:

如果您想要一个带有索引的临时表,请使用临时表。如果你的版本支持这种语法,你可以这样做:

CREATE temp_table (
    ID INT PRIMARY KEY,
    FROMDATE DATETIME,
    TODATE DATETIME,
    INDEX idx_tbl_fromdate (FROMDATE)
);

否则单独创建索引。

【讨论】:

  • 得到“'INDEX' 附近的语法不正确。如果这是表提示的一部分,现在需要 WITH 关键字和括号。有关正确语法,请参阅 SQL Server 联机丛书。”跨度>
  • @user 。 . .正如答案所指出的,表变量中的显式索引仅在 SQL Server 2014 之后才受支持。您可能使用的是不支持此功能的旧版本。在这种情况下,只需使用临时表即可。
  • 根据副本,您可以为此创建唯一约束。 DECLARE @TBL TABLE ( ID INT PRIMARY KEY, FROMDATE DATETIME, TODATE DATETIME, UNIQUE NONCLUSTERED (FROMDATE, [ID]) ); 这是与 CREATE NONCLUSTERED INDEX IX_myindex ON @TBL (FROMDATE); 在允许该语法时无论如何都会创建的索引相同
【解决方案2】:

您可以在表变量定义中定义INDEX

DECLARE @TBL TABLE (
     ID INT PRIMARY KEY, 
     FROMDATE DATETIME, 
     TODATE DATETIME
     INDEX FROMDATE NONCLUSTERED
)

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 2016-02-18
    • 2013-01-24
    • 2017-05-08
    • 2017-09-28
    • 2014-04-27
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多