Échec de la création d'un index clusterisé lors de la création d'une table

10

Nous avons une erreur lors de l'exécution du script suivant;

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 

En particulier, c'est la création d'index cluster qui génère l'erreur suivante:

Msg 1018, niveau 15, état 1, ligne 15
Syntaxe incorrecte près de «INDEX». Si cela est prévu dans le cadre d'une indication de tableau, un mot clé A WITH et des parenthèses sont désormais requis. Consultez la documentation en ligne de SQL Server pour la syntaxe appropriée.

C'est étrange car cela fonctionne sur tous nos serveurs à l'exception d'un serveur QA particulier. Le correctif que nous avons mis en place consiste à créer l'index cluster en dehors de l'instruction de création de table, mais je serais intéressé si quelqu'un avait déjà rencontré ce problème auparavant?

Rich Benner
la source

Réponses:

11

La syntaxe de la déclaration d'index en ligne a été ajoutée dans SQL Server 2014, bien qu'elle ne soit absolument pas claire dans la CREATE TABLEdocumentation officielle . Après avoir parlé aux propriétaires de la documentation, cette rubrique reflète désormais avec précision que la syntaxe d'index en ligne n'est valide qu'à partir de SQL Server 2014 (et de certaines variantes en 2016):

entrez la description de l'image ici

Les autres instances, où cette syntaxe fonctionne pour vous, doivent être sur SQL Server 2014 ou plus récent.

En 2012, quel que soit le niveau de compatibilité, vous devrez créer l'index séparément.

Aaron Bertrand
la source
-9

Je devrais l'exécuter via SSMS pour en être sûr, mais cette syntaxe me regarde. Bien que j'aie défini des colonnes en tant que clés primaires en ligne (comme vous le faites), je n'ai jamais essayé de définir un index clusterisé qui n'était pas la clé primaire de cette façon. Ce que vous faites n'est tout simplement pas possible dans la version de SQL Server que vous utilisez. Je pense que vous devez définir l'index clusterisé à l'aide d'un CREATE INDEX standard après la création de la table via l'instruction CREATE TABLE.

Matthew Sontum
la source
2
Je pensais que cela semblait étrange aussi quand je l'ai vu pour la première fois, mais cela fonctionne très bien sur toutes nos autres boîtes, y compris mes boîtes de développement (jusqu'à vnext). Et crée les deux index très bien.
Rich Benner
Peut-être est-il alors lié à la version de SQL Server exécutée sur le serveur et / ou au mode de compatibilité SQL de la base de données? SQL Server a ajouté beaucoup de «sucre syntaxique» au fil des ans. Si vous remontez assez loin, vous ne pouvez même pas déclarer une variable et la définir sur la même ligne.
Matthew Sontum