Die Clustered-Index-Erstellung schlägt bei der Tabellenerstellung fehl

10

Beim Ausführen des folgenden Skripts ist ein Fehler aufgetreten.

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 

Insbesondere die Clustered-Index-Erstellung löst den folgenden Fehler aus:

Meldung 1018, Ebene 15, Status 1, Zeile 15
Falsche Syntax in der Nähe von 'INDEX'. Wenn dies als Teil eines Tabellenhinweises gedacht ist, sind jetzt das Schlüsselwort A WITH und die Klammer erforderlich. Informationen zur richtigen Syntax finden Sie in den SQL Server-Onlinedokumenten.

Dies ist seltsam, da es auf allen unseren Servern mit Ausnahme eines bestimmten QS-Servers funktioniert. Die Korrektur, die wir eingeführt haben, besteht darin, den Clustered-Index außerhalb der Anweisung zur Tabellenerstellung zu erstellen. Es würde mich jedoch interessieren, ob jemand zuvor auf dieses Problem gestoßen ist.

Rich Benner
quelle

Antworten:

11

Die Syntax für die Inline - Index Erklärung wurde in SQL Server 2014 hinzugefügt aber , dass heißt war absolut unklar , in der offiziellen CREATE TABLEDokumentation . Nach einem Gespräch mit den Dokumentationsbesitzern spiegelt dieses Thema nun genau wider, dass die Inline-Indexsyntax nur ab SQL Server 2014 (und einigen Variationen in 2016) gültig ist:

Geben Sie hier die Bildbeschreibung ein

Die anderen Instanzen, in denen diese Syntax für Sie funktioniert, müssen sich unter SQL Server 2014 oder höher befinden.

Ab 2012 müssen Sie den Index unabhängig von der Kompatibilitätsstufe separat erstellen.

Aaron Bertrand
quelle
-9

Ich müsste es über SSMS ausführen, um sicher zu sein, aber diese Syntax sieht für mich nicht gut aus. Während ich Spalten als Primärschlüssel inline definiert habe (wie Sie es tun), habe ich nie versucht, einen Clustered-Index zu definieren, der auf diese Weise nicht der Primärschlüssel war. Was Sie tun, ist in der von Ihnen verwendeten SQL Server-Version einfach nicht möglich. Ich denke, Sie sollten den Clustered-Index mithilfe eines Standard-CREATE-INDEX definieren, nachdem die Tabelle über die Anweisung CREATE TABLE erstellt wurde.

Matthew Sontum
quelle
2
Ich fand es auch seltsam, als ich es zum ersten Mal sah, aber es funktioniert gut auf allen anderen Boxen, einschließlich meiner Entwickler-Boxen (bis vnext). Und erstellt beide Indizes ganz gut.
Rich Benner
Vielleicht hängt es dann mit der auf dem Server ausgeführten SQL Server-Version und / oder dem SQL-Kompatibilitätsmodus der Datenbank zusammen? SQL Server hat im Laufe der Jahre viel "syntaktischen Zucker" hinzugefügt. Wenn Sie weit genug zurückgehen, können Sie nicht einmal eine Variable deklarieren und in dieselbe Zeile setzen.
Matthew Sontum