Falha na criação do índice em cluster na criação da tabela

10

Ocorreu um erro ao executar o seguinte 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 

Em particular, é a criação do índice em cluster, lançando o seguinte erro:

Msg 1018, Nível 15, Estado 1, Linha 15
Sintaxe incorreta perto de 'INDEX'. Se isso pretender fazer parte de uma dica de tabela, a palavra-chave e os parênteses A WITH serão obrigatórios. Consulte os Manuais Online do SQL Server para obter a sintaxe adequada.

Isso é estranho, pois funciona em todos os nossos servidores, exceto em um servidor de controle de qualidade específico. A correção que colocamos em prática é criar o índice clusterizado fora da instrução de criação da tabela, mas eu estaria interessado se alguém já se deparou com esse problema antes?

Rich Benner
fonte

Respostas:

11

A sintaxe para a declaração do índice em linha foi adicionado no SQL Server 2014, que embora seja era absolutamente claro no oficial CREATE TABLEde documentação . Depois de falar com os proprietários da documentação, esse tópico agora reflete com precisão que a sintaxe do índice embutido é válida apenas a partir do SQL Server 2014 (e algumas variações em 2016):

insira a descrição da imagem aqui

As outras instâncias em que essa sintaxe está funcionando para você devem estar no SQL Server 2014 ou mais recente.

Em 2012, independentemente do nível de compatibilidade, você precisará criar o índice separadamente.

Aaron Bertrand
fonte
-9

Eu teria que executá-lo no SSMS para ter certeza, mas essa sintaxe parece-me. Embora eu tenha definido colunas como chaves primárias embutidas (como você está fazendo), nunca tentei definir um índice de cluster que não fosse a chave primária dessa maneira. O que você está fazendo simplesmente não é possível na versão do SQL Server que você está usando. Eu acho que você deve definir o índice clusterizado usando um CREATE INDEX padrão após a tabela ter sido criada através da instrução CREATE TABLE.

Matthew Sontum
fonte
2
Também achei estranho quando vi pela primeira vez, mas funciona muito bem em todas as nossas outras caixas, incluindo minhas caixas de desenvolvimento (até a próxima). E cria ambos os índices muito bem.
Rich Benner
Talvez ele esteja vinculado à versão do SQL Server em execução no servidor e / ou ao modo de compatibilidade com SQL do banco de dados? O SQL Server adicionou muito "açúcar sintático" ao longo dos anos. Se você voltar o suficiente, não poderá nem mesmo declarar uma variável e configurá-la na mesma linha.
Matthew Sontum