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ê for um autor de relatório que normalmente redige consultas usando instruções SELECT, e não procedimentos, ainda é importante entender os limites de lote. Esses limites afetarão 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), o Azure Data Studio e o SQLCMD, a palavra-chave é GO.

Neste exemplo, há dois lotes distintos, cada um encerrado com um GO:

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

O terminador de lote GO não é uma palavra-chave T-SQL, mas é reconhecido pelo SSMS para indicar o fim de um lote.

Ao trabalhar com lotes T-SQL, há duas considerações importantes a serem consideradas:

  • Lotes são limites para escopo variável, o que significa que uma variável definida em um lote pode ser referenciada apenas por outro código no mesmo lote
  • Algumas instruções, normalmente instruções de definição de dados, como CREATE VIEW, CREATE FUNCTION e CREATE PROCEDURE, podem não 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 será ú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. Todos os erros encontrados farão com que todo o lote seja rejeitado; não haverá 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 pode ser executada, a menos que você tenha adicionado tratamento de erro 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 instruções INSERT fosse invertida e o erro de sintaxe ocorresse na segunda linha, a primeira linha não seria executada porque todo o lote seria rejeitado.

Usando o exemplo anterior, este lote 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

Nos exemplos anteriores, usamos instruções INSERT em vez de SELECT porque é mais comum que instruções de modificação sejam agrupadas em lotes do que instruções SELECT.