Descrever lotes

Concluído

Os lotes T-SQL são coleções de uma ou mais instruções T-SQL que são enviadas ao SQL Server por um cliente como uma única unidade. O SQL Server opera em todas as instruções de um lote simultaneamente ao analisar, otimizar e executar o código.

Se você é um autor de relatório que normalmente grava consultas usando instruções SELECT e não procedimentos, ainda é importante entender os limites do lote. Esses limites afetam seu trabalho com variáveis e parâmetros em procedimentos armazenados e outras rotinas. Por exemplo, uma variável deve ser declarada no mesmo lote em que é referenciada. Portanto, é importante reconhecer o que está contido em um lote.

Os lotes são delimitados pelo aplicativo cliente. A forma como você marca o final de um lote depende das configurações do seu cliente. Para clientes da Microsoft, incluindo o SSMS (SQL Server Management Studio) e o SQLCMD, a palavra-chave é GO.

Neste exemplo, há dois lotes distintos, cada um encerrado com uma GO instrução:

CREATE VIEW <view_name>
AS ...
GO
CREATE PROCEDURE <procedure_name>
AS ...
GO

O terminador GO de lote não é uma palavra-chave T-SQL; é um comando reconhecido pelo SSMS, pelo sqlcmd utilitário e pela extensão mssql para Visual Studio Code para sinalizar o fim de um lote.

Tenha duas considerações importantes em mente ao trabalhar com lotes T-SQL:

  • Lotes são limites para escopo variável, o que significa que uma variável definida em um lote só pode ser referenciada por outro código no mesmo lote
  • Algumas instruções, normalmente instruções de definição de dados, como CREATE VIEW, CREATE FUNCTIONe CREATE PROCEDURE não podem ser combinadas com outras no mesmo lote.

Trabalhando com lotes

Um lote é uma coleção de instruções T-SQL enviadas ao SQL Server para análise e execução. Entender como os lotes são analisados é útil para identificar mensagens de erro e comportamento. Quando um lote é enviado por um cliente, como quando você pressiona o botão Executar no SSMS, o lote é analisado para erros de sintaxe pelo mecanismo do SQL Server. Os erros encontrados fazem com que todo o lote seja rejeitado; não há nenhuma execução parcial de instruções no lote.

Se o lote passar na verificação de sintaxe, o SQL Server executará outras etapas, resolvendo nomes de objetos, verificando permissões e otimizando o código para execução. Quando esse processo for concluído e a execução for iniciada, as instruções serão bem-sucedidas ou falharão individualmente. Esse é um contraste importante com a verificação de sintaxe. Quando ocorre um erro de runtime em uma linha, a próxima linha ainda pode ser executada, a menos que você adicione tratamento de erros ao código.

Por exemplo, o lote a seguir contém um erro de sintaxe:

INSERT INTO dbo.t1 VALUE(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO

Ele fornece esta mensagem de erro:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'VALUE'.

O erro ocorreu na linha 1, mas todo o lote é rejeitado e a execução não continua com a linha 2. Mesmo se cada uma das INSERT instruções fossem invertidas e o erro de sintaxe ocorresse na segunda linha, a primeira linha não seria executada porque todo o batch seria rejeitado.

Por outro lado, esse lote corrigido não contém um erro:

INSERT INTO dbo.t1 VALUES(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO

Os exemplos anteriores usam INSERT instruções em vez de SELECT porque as instruções de modificação são mais comumente agrupadas em lotes.