【问题标题】:SQL Server index creation in 2012 and 20162012 年和 2016 年的 SQL Server 索引创建
【发布时间】:2017-12-21 07:01:24
【问题描述】:

以下索引脚本在 SQL Server 2012 中失败:

CREATE TABLE #ContextDetailTaskTable  
(
    ContextDetailID bigint not null,
    index #ContextDetailTaskTableIndex clustered (ContextDetailID)
)

错误:

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

而在 SQL Server 2016 中也是如此。

我已将事务隔离级别设置为快照,因此无法创建索引https://connect.microsoft.com/SQLServer/feedback/details/531747/error-3964-on-create-index-on-temporary-table-under-snapshot-isolation-level

我们添加了一个虚拟列并在其中添加了标识。希望这不会影响性能?

SQL Server 2012 中的解决方法:

CREATE TABLE #ContextIDTable  
(
     ContextDetailID bigint NOT NULL,
     ID1 INT NOT NULL identity(1,1),

     CONSTRAINT PK_#ContextIDTable 
         PRIMARY KEY CLUSTERED (ContextDetailID, ID1)
)

【问题讨论】:

    标签: sql-server-2012 sql-server-2016


    【解决方案1】:

    您应该改用此代码:

    CREATE TABLE #ContextDetailTaskTable  
    (
        ContextDetailID BIGINT NOT NULL
            CONSTRAINT PK_ContextDetailTaskTable PRIMARY KEY CLUSTERED
    )
    

    定义一个约束并使其成为集群主键。这将在幕后自动创建一个索引。

    这应该可以在任何版本的 SQL Server 2005 及更高版本中正常工作。

    如果您查看 Microsoft documentation on CREATE TABLE,您会发现您使用的 index ..... 语法仅适用于 SQL Server 2014 和更新版本。

    【讨论】:

    • @MartinSmith:确实如此——从被问到的问题的方式上,我猜测会是这种情况——但不清楚,我同意。我的方法当然只有在 ID 实际上是主键并且因此是唯一的情况下才有效
    • --2016 CREATE TABLE #ContextIDTable (ContextDetailID bigint NOT NULL, index #ContextDetailTableIndex clustered (ContextDetailID)) --2012 CREATE TABLE #WFEngineQueueCompleteOrphanInstanceTable ( ID uniqueidentifier NOT NULL, CONSTRAINT PK_#WFEngineQueueCompleteOrphanInstanceTable PRIMARY KEY CLUSTERED ( ID))我们得到一些临时表的主要错误,是否有一种解决方法可以在没有主键的情况下创建索引。
    • @omkar:请不要将代码示例或示例数据放入 cmets - 因为您无法对其进行格式化,所以阅读它非常困难。 ... 相反:更新您的问题,通过编辑它来提供附加信息!谢谢。
    • 当然很抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多