Ошибка создания кластерного индекса при создании таблицы


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». Если это предназначено как часть табличной подсказки, теперь требуются ключевое слово WITH и скобки. См. 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
Я подумал, что это тоже выглядело странно, когда я впервые увидел его, но он отлично работает на всех наших других блоках, включая мои dev-блоки (вплоть до vnext). И создает оба индекса просто отлично.
Рич Беннер

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