在表变量

时间:2016-01-21 08:14:53

标签: sql sql-server tsql sql-server-2012 sql-server-2014

我需要在两列(在表变量中)创建一个不形成唯一键的索引。

表结构如下所示 -

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

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

2 个答案:

答案 0 :(得分:4)

您不能使用2014年之前的SQL Server版本在表变量上构建除唯一键之外的索引。

但是,您可以这样做:添加一个具有自动增量值的colummn,并创建包含您需要的列和新列的唯一索引。

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

更新:实际上,在表变量上创建这样的索引可能毫无用处。通常,SQL Server估计表变量只有一行,因此它不会以相对较高的概率使用此索引。

答案 1 :(得分:1)

据我所知,在SQL Server 2012及更低版本中,您无法向表变量添加索引。要添加索引,您必须声明表格如下:

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

当然,在您完成四个功能的表后,您可以调用

DROP TABLE #Sample