创建表时聚簇索引创建失败


10

运行以下脚本时出现错误;

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES 
  WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='Table_Name')
BEGIN
CREATE TABLE Table_Name
(
    Field_Name_1 binary(32) NOT NULL CONSTRAINT PK_Name_Goes_Here PRIMARY KEY NONCLUSTERED
    , Field_Name_2 int NOT NULL 
    , Field_Name_3 datetime NOT NULL INDEX IX_Name_Goes_Here CLUSTERED
)
END 

特别是聚集索引的创建会引发以下错误:

消息1018,级别15,状态1,第15行
'INDEX'附近的语法不正确。如果要将其用作表提示的一部分,则现在需要A WITH关键字和括号。有关正确的语法,请参见SQL Server联机丛书。

这很奇怪,因为它适用于我们所有的服务器,但特定的质量检查服务器除外。我们已经解决的问题是在表创建语句之外创建聚簇索引,但是如果有人之前遇到过此问题,我将很感兴趣。

Answers:


11

内联指数声明的语法在SQL Server 2014中添加,虽然这就是 在完全不清楚官方CREATE TABLE文档。与文档所有者交谈后,该主题现在可以准确地反映出内联索引语法仅从SQL Server 2014(以及2016年的某些变体)开始才有效:

在此处输入图片说明

使用该语法的其他实例必须在SQL Server 2014或更高版本上。

在2012年,无论兼容级别如何,您都需要单独创建索引。


-9

我必须通过SSMS运行它才能确定,但​​是这种语法对我来说似乎很遥远。尽管我已将列定义为内联主键(就像您在做的那样),但我从未尝试定义不是这种方式的主键的聚集索引。您正在使用的SQL Server版本根本无法执行您的操作。我认为在通过CREATE TABLE语句创建表之后,应该使用标准的CREATE INDEX定义聚簇索引。


2
我以为,当我第一次看到它时,它看起来也很奇怪,但是它在我们所有其他机器上都可以正常工作,包括我的开发机器(直到vnext)。并且创建两个索引都很好。
Rich Benner

也许然后将它与服务器上运行的SQL Server版本和/或数据库的SQL兼容模式相关联?多年来,SQL Server添加了许多“语法糖”。如果返回足够远,您甚至无法声明变量并将其设置在同一行中。
马修·桑顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.