Tworzenie indeksu klastrowego nie powiodło się podczas tworzenia tabeli

10

Wystąpił błąd podczas uruchamiania następującego skryptu;

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 

W szczególności jest to tworzenie indeksu klastrowego powodujące następujący błąd:

Msg 1018, poziom 15, stan 1, wiersz 15
Niepoprawna składnia w pobliżu „INDEKSU”. Jeśli jest to zamierzone jako podpowiedź do tabeli, słowo kluczowe A WITH i nawiasy są teraz wymagane. Zobacz SQL Server Books Online, aby uzyskać odpowiednią składnię.

Jest to dziwne, ponieważ działa na wszystkich naszych serwerach, z wyjątkiem określonego serwera kontroli jakości. Poprawka, którą wprowadziliśmy, polega na utworzeniu indeksu klastrowego poza instrukcją tworzenia tabeli, ale byłbym zainteresowany, gdyby ktoś wcześniej napotkał ten problem?

Rich Benner
źródło

Odpowiedzi:

11

Składnia deklaracji indeksu wbudowanego została dodana w SQL Server 2014, choć nie jest to całkowicie jasne w oficjalnej CREATE TABLEdokumentacji . Po rozmowie z właścicielami dokumentacji ten temat dokładnie odzwierciedla teraz, że wbudowana składnia indeksu jest ważna tylko od SQL Server 2014 (i niektórych odmian w 2016):

wprowadź opis zdjęcia tutaj

Inne instancje, w których ta składnia działa dla Ciebie, muszą mieć wersję SQL Server 2014 lub nowszą.

W 2012 r. Niezależnie od poziomu zgodności musisz utworzyć indeks osobno.

Aaron Bertrand
źródło
-9

Musiałbym uruchomić go za pośrednictwem SSMS, aby się upewnić, ale ta składnia nie wygląda na mnie. Chociaż zdefiniowałem kolumny jako wbudowane klucze podstawowe (tak jak ty), nigdy nie próbowałem zdefiniować indeksu klastrowego, który nie byłby kluczem podstawowym w ten sposób. To, co robisz, po prostu nie jest możliwe w używanej wersji SQL Server. Myślę, że powinieneś zdefiniować indeks klastrowy za pomocą standardowego CREATE INDEX po utworzeniu tabeli za pomocą instrukcji CREATE TABLE.

Matthew Sontum
źródło
2
Myślałem, że to też dziwnie wyglądało, kiedy go zobaczyłem, ale działa dobrze na wszystkich naszych innych urządzeniach, w tym na moich programistach (do vnext). I dobrze tworzy oba indeksy.
Rich Benner
Być może jest to związane z wersją SQL Server działającą na serwerze i / lub trybem zgodności bazy danych SQL? SQL Server dodał wiele „cukru syntaktycznego” na przestrzeni lat. Jeśli cofniesz się wystarczająco daleko, nie możesz nawet zadeklarować zmiennej i ustawić jej w tym samym wierszu.
Matthew Sontum