La creación del índice agrupado falla en la creación de la tabla

10

Tenemos un error al ejecutar el siguiente 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 

En particular, es la creación del índice agrupado arrojando el siguiente error:

Mensaje 1018, Nivel 15, Estado 1, Línea 15
Sintaxis incorrecta cerca de 'ÍNDICE'. Si esto está pensado como parte de una sugerencia de tabla, ahora se requiere una palabra clave y paréntesis A WITH. Consulte los Libros en pantalla de SQL Server para obtener la sintaxis adecuada.

Esto es extraño ya que funciona en todos nuestros servidores, excepto en un servidor de control de calidad en particular. La solución que hemos establecido es crear el índice agrupado fuera de la declaración de creación de la tabla, pero me interesaría si alguien se ha encontrado con este problema antes.

Rich Benner
fuente

Respuestas:

11

La sintaxis para la declaración de índice en línea se añadió en SQL Server 2014, sin embargo, que es fue absolutamente claro en el funcionario de CREATE TABLEla documentación . Después de hablar con los propietarios de la documentación, ese tema ahora refleja con precisión que la sintaxis del índice en línea solo es válida a partir de SQL Server 2014 (y algunas variaciones en 2016):

ingrese la descripción de la imagen aquí

Las otras instancias, donde esta sintaxis funciona para usted, deben estar en SQL Server 2014 o posterior.

En 2012, independientemente del nivel de compatibilidad, deberá crear el índice por separado.

Aaron Bertrand
fuente
-9

Tendría que ejecutarlo a través de SSMS para saberlo con certeza, pero esa sintaxis me parece desagradable. Si bien he definido columnas como claves principales en línea (como lo está haciendo), nunca he intentado definir un índice agrupado que no fuera la clave principal de esa manera. Lo que está haciendo simplemente no es posible en la versión de SQL Server que está utilizando. Creo que debería definir el índice agrupado utilizando un CREATE INDEX estándar después de que la tabla se haya creado a través de la instrucción CREATE TABLE.

Matthew Sontum
fuente
2
Pensé que también parecía extraño cuando lo vi por primera vez, pero funciona bien en todos nuestros otros cuadros, incluidos mis cuadros de desarrollo (hasta el siguiente). Y crea ambos índices muy bien.
Rich Benner
¿Quizás entonces está vinculado a la versión de SQL Server que se ejecuta en el servidor y / o al modo de compatibilidad SQL de la base de datos? SQL Server ha agregado una gran cantidad de 'azúcar sintáctico' a lo largo de los años. Si retrocede lo suficiente, ni siquiera puede declarar una variable y establecerla en la misma línea.
Matthew Sontum