Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Erro 111 do SQL Server:“…deve ser a primeira instrução em um lote de consulta”


No SQL Server, um lote é um grupo de uma ou mais instruções T-SQL enviadas ao mesmo tempo de um aplicativo para o SQL Server para execução.

Se você encontrar um erro como este:
Msg 111, Level 15, State 1, Line 2
'CREATE VIEW' must be the first statement in a query batch.

Provavelmente é porque você está combinando a instrução com outras instruções no mesmo lote, o que não é permitido em lotes.

A primeira parte da mensagem de erro dependerá da instrução real que você está usando em seu lote. No meu caso é CREATE VIEW , mas poderia facilmente ser CREATE PROCEDURE , CREATE FUNCTION , etc se essas são as declarações que você está usando.

Exemplo


Aqui está um exemplo de algum código que causaria esse erro:
DROP VIEW IF EXISTS vAllCustomers;

CREATE VIEW vAllCustomers AS
SELECT * FROM Customers;

Resultado:
Msg 111, Level 15, State 1, Line 3
'CREATE VIEW' must be the first statement in a query batch.

No meu caso, estou tentando executar duas instruções; a DROP VIEW instrução e um CREATE VIEW demonstração.

As regras de um lote T-SQL afirmam que o CREATE VIEW A instrução não pode ser combinada com outras instruções no mesmo lote.

Em outras palavras, CREATE VIEW pode ser a única instrução em seu lote.

Como corrigir o erro


Podemos corrigir o erro acima simplesmente adicionando um separador de lote após a primeira instrução.

No SQL Server, o GO palavra-chave sinaliza o fim de um lote. Mais especificamente, os utilitários do SQL Server interpretam GO como um sinal de que eles devem enviar o lote atual de instruções T-SQL para uma instância do SQL Server.

Assim, poderíamos alterar a declaração anterior para isso:
DROP VIEW IF EXISTS vAllCustomers;
GO
CREATE VIEW vAllCustomers AS
SELECT * FROM Customers;
GO

Adicionando GO corrige o problema separando as instruções em dois lotes separados.

Observe que GO não é realmente parte do T-SQL. É um comando reconhecido pelos utilitários do SQL Server com a finalidade de separar instruções em lotes.

Você poderá alterar o separador de lotes, dependendo da ferramenta usada para se conectar ao SQL Server. Por exemplo, no SSMS, você pode encontrar essa opção acessando:Ferramentas> Opções> Execução da consulta> SQL Server e procure uma opção que diga algo como “Especifique uma palavra ou caractere que possa ser usado para separar lotes”.