Pembuatan indeks cluster gagal pada pembuatan tabel

10

Kami mendapat kesalahan saat menjalankan skrip berikut;

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 

Khususnya itu adalah pembuatan indeks berkerumun melempar kesalahan berikut:

Msg 1018, Level 15, Status 1, Baris 15
Sintaks salah dekat 'INDEX'. Jika ini dimaksudkan sebagai bagian dari petunjuk tabel, kata kunci WITH dan tanda kurung sekarang diperlukan. Lihat SQL Server Books Online untuk sintaksis yang tepat.

Ini aneh karena berfungsi pada semua server kami kecuali untuk server QA tertentu. Perbaikan yang kami lakukan adalah membuat indeks berkerumun di luar pernyataan pembuatan tabel tapi saya akan tertarik jika ada yang pernah menemukan masalah ini sebelumnya?

Rich Benner
sumber

Jawaban:

11

Sintaks untuk inline indeks deklarasi ditambahkan di SQL Server 2014, meskipun itu yaitu adalah benar-benar tidak jelas di resmi CREATE TABLEdokumentasi . Setelah berbicara dengan pemilik dokumentasi, topik itu sekarang secara akurat mencerminkan bahwa sintaksis sebaris indeks hanya valid dimulai dengan SQL Server 2014 (dan beberapa variasi pada 2016):

masukkan deskripsi gambar di sini

Contoh lain, di mana sintaks ini bekerja untuk Anda, harus di SQL Server 2014 atau yang lebih baru.

Pada 2012, terlepas dari tingkat kompatibilitas, Anda harus membuat indeks secara terpisah.

Aaron Bertrand
sumber
-9

Saya harus menjalankannya melalui SSMS untuk mengetahui dengan pasti, tetapi sintaks yang terlihat bagi saya. Meskipun saya telah mendefinisikan kolom sebagai kunci utama sebaris (seperti yang Anda lakukan), saya tidak pernah mencoba untuk mendefinisikan indeks berkerumun yang bukan kunci utama dalam mode itu. Apa yang Anda lakukan tidak mungkin dalam versi SQL Server yang Anda gunakan. Saya pikir Anda harus mendefinisikan indeks berkerumun menggunakan indeks CREATE INDEX setelah tabel dibuat melalui pernyataan CREATE TABLE.

Matthew Sontum
sumber
2
Saya pikir itu terlihat aneh juga ketika saya pertama kali melihatnya tetapi bekerja dengan baik pada semua kotak kami yang lain, termasuk kotak dev saya (hingga vnext). Dan menciptakan kedua indeks dengan baik.
Rich Benner
Mungkin itu terkait dengan versi SQL Server yang berjalan di server, dan / atau mode kompatibilitas SQL dari database? SQL Server telah menambahkan banyak 'gula sintaksis' selama bertahun-tahun. Jika Anda kembali cukup jauh, Anda bahkan tidak dapat mendeklarasikan variabel dan mengaturnya di baris yang sama.
Matthew Sontum