La creazione dell'indice cluster non riesce alla creazione della tabella


10

Si è verificato un errore durante l'esecuzione del seguente script;

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 

In particolare è la creazione dell'indice cluster che genera il seguente errore:

Messaggio 1018, livello 15, stato 1, riga 15
Sintassi errata vicino a "INDICE". Se questo è inteso come parte di un suggerimento per la tabella, sono ora necessari una parola chiave WITH e una parentesi. Vedere la documentazione in linea di SQL Server per la sintassi corretta.

Questo è strano in quanto funziona su tutti i nostri server ad eccezione di un particolare server QA. La correzione che abbiamo messo in atto è quella di creare l'indice cluster al di fuori dell'istruzione di creazione della tabella ma sarei interessato se qualcuno avesse riscontrato questo problema prima?

Risposte:


11

La sintassi per la dichiarazione di indice in linea è stato aggiunto in SQL Server 2014, però che a dire era assolutamente chiaro nella Gazzetta CREATE TABLEdocumentazione . Dopo aver parlato con i proprietari della documentazione, quell'argomento ora riflette accuratamente che la sintassi dell'indice in linea è valida solo a partire da SQL Server 2014 (e alcune varianti nel 2016):

inserisci qui la descrizione dell'immagine

Le altre istanze in cui questa sintassi funziona correttamente devono essere su SQL Server 2014 o versioni successive.

Nel 2012, indipendentemente dal livello di compatibilità, dovrai creare l'indice separatamente.


-9

Dovrei eseguirlo tramite SSMS per sapere con certezza, ma quella sintassi mi sembra. Mentre ho definito le colonne come chiavi primarie in linea (come stai facendo) non ho mai tentato di definire un indice cluster che non fosse la chiave primaria in quel modo. Quello che stai facendo semplicemente non è possibile nella versione di SQL Server che stai utilizzando. Penso che dovresti definire l'indice cluster usando un CREATE INDEX standard dopo che la tabella è stata creata tramite l'istruzione CREATE TABLE.


2
Ho pensato che fosse strano anche quando l'ho visto per la prima volta, ma funziona benissimo su tutte le altre nostre scatole, comprese le mie scatole di sviluppo (fino al successivo). E crea entrambi gli indici bene.
Rich Benner,

Forse allora è legato alla versione di SQL Server in esecuzione sul server e / o alla modalità di compatibilità SQL del database? SQL Server ha aggiunto molto "zucchero sintattico" nel corso degli anni. Se torni abbastanza lontano non puoi nemmeno dichiarare una variabile e impostarla sulla stessa riga.
Matthew Sontum,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.