クラスタ化インデックスの作成がテーブルの作成に失敗する


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」付近の構文が正しくありません 。これがテーブルヒントの一部として意図されている場合、WITHキーワードと括弧が必要になりました。適切な構文については、SQL Server Books Onlineを参照してください。

特定のQAサーバーを除くすべてのサーバーで機能するため、これは奇妙です。私たちが行った修正は、テーブル作成ステートメントの外でクラスター化インデックスを作成することですが、誰かが以前にこの問題に遭遇したことがあれば、興味がありますか?

回答:


11

それにもかかわらず、インライン指標宣言の構文は、SQL Serverの2014年に追加されましたISが に絶対的に不明確な公式CREATE TABLE文書。ドキュメントの所有者と話した後、そのトピックは、インラインインデックス構文がSQL Server 2014以降(および2016年のいくつかのバリエーション)でのみ有効であることを正確に反映しています。

ここに画像の説明を入力してください

この構文が機能する他のインスタンスは、SQL Server 2014以降である必要があります。

2012では、互換性レベルに関係なく、インデックスを個別に作成する必要があります。


-9

確実に知るには、SSMSを介して実行する必要がありますが、その構文は私には見落としています。(あなたがしているように)列を主キーとしてインラインで定義しましたが、その方法で主キーではないクラスター化インデックスを定義しようとしたことはありません。あなたがしていることは、あなたが使っているSQL Serverバージョンでは不可能です。CREATE TABLEステートメントでテーブルを作成した後、標準のCREATE INDEXを使用してクラスター化インデックスを定義する必要があると思います。


2
最初に見たときも奇妙に見えましたが、私の開発ボックス(vnextまで)を含む他のすべてのボックスで問題なく動作しました。そして、両方のインデックスをうまく作成します。
リッチベナー2017

おそらくそれは、サーバーで実行されているSQL ServerのバージョンやデータベースのSQL互換モードに関連付けられているのでしょうか。SQL Serverは、長年にわたって多くの「構文上の砂糖」を追加してきました。十分に前に戻ると、変数を宣言して同じ行に設定することさえできません。
2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.