Descrever lotes
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 FUNCTIONeCREATE PROCEDUREnã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.