在 table 变量上创建索引子句

create index clause on table variable

我需要在不构成唯一键的两列(在 table 变量内)上创建索引。

Table结构如下图-

DECLARE @Sample TABLE (                           
    [AssetSk] [int] NOT NULL,                
    [DateSk] [int] NOT NULL,             
    [Count] [numeric](38, 2) NULL         
    )  

我正在尝试添加如下所示的索引 -

INDEX AD1 CLUSTERED([AssetSk],[DateSk])  

然而,在 运行 在 SQL Server 2012
上使用它时,它给了我以下错误 “ 'INDEX' 附近的语法不正确。如果这是作为 table 提示的一部分,现在需要 WITH 关键字和括号。有关正确的语法,请参阅 SQL 服务器联机丛书。”。 =13=]

但是,这个 运行 在 SQL Server 2014 上非常完美。有什么办法可以在 SQL Server 2012 上 运行 它。

您不能使用 SQL 2014 年之前的服务器版本在 table 变量上建立唯一键以外的索引。

但是,您可以使用技巧:再添加一个具有自动增量值的列,并创建唯一索引,包括您需要的列和这个新列。

DECLARE @Sample TABLE (
    [ID] bigint identity(1, 1),                           
    [AssetSk] [int] NOT NULL,                
    [DateSk] [int] NOT NULL,             
    [Count] [numeric](38, 2) NULL,
    UNIQUE NONCLUSTERED ([AssetSk],[DateSk], ID)       
    )

更新: 事实上,在 table 变量上创建这样的索引可能是无用的。通常SQL服务器估计一个table变量只有一行,所以它不会使用这个索引的概率比较大。

据我所知,在 SQL Server 2012 及以下版本中,您无法向 table 变量添加索引。要添加索引,您必须像这样声明 table:

CREATE TABLE #Sample (                           
[AssetSk] [int] NOT NULL,                
[DateSk] [int] NOT NULL,             
[Count] [numeric](38, 2) NULL         
)  

然后你可以像这样创建你需要的索引

CREATE CLUSTERED INDEX IX_MyIndex
 ON #Sample ([AssetSk],[DateSk])

当然,当你完成table的四个函数后,你可以调用

DROP TABLE #Sample