Lotes

Um lote é um grupo de uma ou mais instruções Transact-SQL enviadas ao mesmo tempo de um aplicativo SQL Server para execução. O SQL Server compila as instruções de um lote em uma única unidade executável, chamada plano de execução. As instruções no plano de execução são então executadas uma de cada vez.

Cada instrução Transact-SQL deve ser terminada com um ponto-e-vírgula. Esse requisito não é obrigatório, mas a habilidade para terminar uma instrução sem um ponto-e-vírgula é preterida e pode ser removida em uma versão futura do Microsoft SQL Server.

Um erro de compilação, tal como um erro de sintaxe, evita a compilação do plano de execução. Então, nenhuma instrução no lote é executada.

Um erro em tempo de execução, tal como um excesso aritmético ou uma violação de restrição, tem um dos seguintes efeitos:

  • A maioria dos erros em tempo de execução interrompe a instrução atual e as instruções que se seguem no lote.

  • Alguns erros em tempo de execução, como violações de restrição, interrompem apenas a instrução atual. São executadas todas as instruções restantes no lote.

As instruções que são executadas antes da instrução, que encontrou o erro em tempo de execução, não são afetadas. A única exceção é quando o lote estiver em uma transação e o erro faz com que a transação seja revertida. Nesse caso, qualquer modificação de dados não comprometida, realizada antes do erro em tempo de execução, é revertida.

Por exemplo, imagine que existam 10 instruções em um lote. Se a quinta instrução tiver um erro de sintaxe, nenhuma instrução no lote será executada. Se o lote for compilado e a segunda instrução falhar enquanto estiver sendo executada, os resultados da primeira instrução não são afetados porque ela já foi executada.

O SQL Server fornece recompilação no nível de instrução. Isto é, se uma instrução engatilhar uma recompilação, só aquela instrução será recompilada e não o lote inteiro. Esse comportamento difere do SQL Server 2000. Considere o exemplo seguinte que contém uma instrução CREATE TABLE e quatro instruções INSERT no mesmo lote.

CREATE TABLE dbo.t3(a int) ;
INSERT INTO dbo.t3 VALUES (1) ;
INSERT INTO dbo.t3 VALUES (1,1) ;
INSERT INTO dbo.t3 VALUES (3) ;
GO

SELECT * FROM dbo.t3 ;

Primeiro, o lote é compilado. A instrução CREATE TABLE é compilada, mas porque a tabela dbo.t3 ainda não existe, as INSERT instruções não são compiladas.

Segundo, o lote começa a executar. A tabela é criada. O primeiro INSERT é compilado e então imediatamente executado. A tabela tem agora uma linha. Então, a segunda instrução INSERT é compilada. A compilação falha, e o lote é terminado. A instrução SELECT retorna uma linha.

No SQL Server 2000, o lote começa a executar e a tabela é criada. As três instruções INSERT são compiladas uma por uma, mas não são executadas. Como o segundo INSERT causa um erro de compilação, o lote inteiro é terminado. A instrução SELECT não retorna nenhuma linha.

Regras para usar lotes

As seguintes regras se aplicam para usar lotes:

  • As instruções CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER e CREATE VIEW não podem ser combinados com outras instruções em um lote. A instrução CREATE deve iniciar o lote. Todas as outras instruções a seguir naquele lote serão interpretadas como parte da definição da primeira instrução CREATE.

  • Uma tabela não pode ser alterada e então as novas colunas serem referenciadas no mesmo lote.

  • Se uma instrução EXECUTE for a primeira instrução em um lote, a palavra-chave EXECUTE não será solicitada. A palavra-chave EXECUTE é solicitada se a instrução EXECUTE não for primeira em um lote.

Observação importanteImportante

Arquivos de lote podem conter credenciais armazenadas em texto comum. As credenciais podem voltar à tela do usuário durante a execução do lote.