Створення кластерного індексу не вдається створити таблицю


10

У нас виникла помилка під час запуску наступного сценарію;

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 

Зокрема, це створення кластерного індексу, яке видає таку помилку:

Повідомлення 1018, рівень 15, стан 1, рядок 15
Неправильний синтаксис біля "INDEX". Якщо це призначено як частина натяку на таблицю, тепер потрібні ключове слово AND дужки. Дивіться SQL Server Books Online для правильного синтаксису.

Це дивно, оскільки воно працює на всіх наших серверах, крім конкретного сервера QA. Ми вирішили створити кластерний індекс за межами оператора створення таблиці, але мені було б цікаво, чи хтось раніше стикався з цією проблемою?

Відповіді:


11

Синтаксис вбудованого індексу оголошень був доданий у SQL Server 2014, хоча це було абсолютно незрозумілим в офіційній CREATE TABLEдокументації . Після розмови з власниками документації ця тема тепер точно відображає, що синтаксис вбудованого індексу дійсний лише починаючи з SQL Server 2014 (та деяких варіацій у 2016 році):

введіть тут опис зображення

Інші випадки, коли цей синтаксис працює для вас, повинні бути на SQL Server 2014 або новіші.

У 2012 році, незалежно від рівня сумісності, вам потрібно буде створити індекс окремо.


-9

Мені доведеться запустити його через SSMS, щоб точно знати, але цей синтаксис мені здається незрозумілим. Хоча я визначав стовпчики як вбудовані первинні ключі (як ви це робите), я ніколи не намагався визначити кластерний індекс, який не був таким первинним ключем. Те, що ви робите, просто неможливо у використаній вами версії SQL Server. Я думаю, вам слід визначити кластерний індекс за допомогою стандартного CREATE INDEX після того, як таблиця була створена через оператор CREATE TABLE.


2
Я думав, що це виглядало дивно, коли я вперше побачив це, але він працює чудово на всіх інших наших коробках, включаючи мої коробки для розробників (до vnext). І створює обидва індекси просто чудово.
Річ Беннер

Можливо, тоді вона прив’язана до версії SQL Server, що працює на сервері, та / або режиму сумісності SQL бази даних? Протягом багатьох років SQL Server додав багато синтаксичного цукру. Якщо ви повернетесь досить далеко, ви навіть не можете оголосити змінну і встановити її в одному рядку.
Метью Сонтум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.