Descrever lotes
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 processa todas as instruções num lote ao mesmo tempo, quando analisa, otimiza e executa o código.
Se você for um redator de relatórios que normalmente escreve consultas usando instruções SELECT e não procedimentos, é ainda importante compreender 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. É importante, portanto, 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 Microsoft, incluindo SQL Server Management Studio (SSMS), Azure Data Studio e SQLCMD, a palavra-chave é GO.
Neste exemplo, há dois lotes distintos, cada um terminado com um comando 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 é uma palavra reconhecida pelo SSMS para indicar o fim de um lote.
Ao trabalhar com lotes T-SQL, há duas considerações importantes a ter em mente:
- 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 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. Compreender 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 em busca de erros de sintaxe pelo mecanismo do SQL Server. Quaisquer erros encontrados farão com que todo o lote seja rejeitado; Não haverá execução parcial de declarações dentro do 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 este processo é concluído e a execução começa, as declarações têm sucesso ou falham individualmente. Este é um contraste importante com a verificação de sintaxe. Quando ocorre um erro de tempo de execução em uma linha, a próxima linha pode ser executada, a menos que você tenha adicionado tratamento de erros ao código.
Por exemplo, o seguinte lote 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 dá 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 que cada uma das instruções INSERT fosse revertida 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.