Qual é o raciocínio por trás do uso da instrução GO após cada instrução SQL? Entendo que o GO sinaliza o fim do lote e/ou permite a reputação das declarações, mas qual a vantagem de usá-lo após cada declaração.
Estou apenas curioso, pois muita documentação da Microsoft etc. começou a usá-lo após cada declaração ou talvez eu tenha começado a notar.
Além disso, o que é considerado a melhor prática?
Antes de responder quando usá-lo e por que, é primordial entender exatamente o que
GO
é e o que não é.A palavra-chave
GO
é usada pelo SQL Server Management Studio e SQLCMD para significar uma coisa e apenas uma coisa: O fim de um lote de instruções. Na verdade, você pode até alterar o que usa para encerrar lotes para algo diferente de "GO":Essa captura de tela acima é uma opção configurável no SSMS.
Mas o que é um lote?? Esta referência BOL diz melhor:
Simples assim. É apenas uma maneira personalizada de um aplicativo (sim... um aplicativo) enviar instruções para o SQL Server. Vamos ver um exemplo de aparência de aplicativo disso. Usarei o PowerShell para imitar o que um aplicativo faria para enviar instruções e lotes para o SQL Server:
Os comentários revelam, mas você pode ver acima que estamos enviando dois lotes programaticamente para o SQL Server. Vamos verificar isso, no entanto. Minha escolha aqui é usar Eventos Estendidos:
Tudo o que essa sessão de XEvents está fazendo é capturar as instruções e lotes que iniciam e são concluídos de um aplicativo chamado
"BatchTesting"
(se você observar minha string de conexão no exemplo de código do PowerShell, é uma maneira rápida de examinar um originador específico de eventos usando o "application name" parâmetro de string de conexão e filtrando isso).Depois de executar o código do PowerShell para enviar esses lotes e instruções, vejo os seguintes resultados:
Como você pode ver na captura de tela, fica claro como as instruções são divididas em dois lotes diferentes, também evidente pelos meios que usamos para chamar os lotes. E se olharmos na
batch_text
primeira ocorrência desql_batch_starting
, podemos ver todas as instruções incluídas nesse lote:Com essa explicação do que é um lote, agora vem a resposta para sua pergunta sobre quando encerrar os lotes. As regras para lotes são encontradas nesta referência BOL sobre lotes :
Da mesma forma, certos erros de tempo de execução (erros de compilação não permitem que a execução de um lote seja iniciado) que ocorrem durante um lote podem causar diferentes comportamentos: abortar o lote totalmente ou continuar o lote e apenas abortar a instrução incorreta (o acima link fornece dois exemplos realmente bons: um erro de estouro aritmético, por exemplo, interromperá a execução do lote, enquanto um erro de violação de restrição impedirá apenas a conclusão da instrução atual, mas o lote continuará sendo executado).
Como muitas coisas em nossa profissão, porém, a preferência pessoal será uma grande força motriz por trás de como você, como indivíduo e escritor de código T-SQL, encerra lotes. Algumas pessoas apenas definem lotes explicitamente quando absolutamente necessário (veja acima para esses requisitos), e outras encerram lotes programaticamente 100% do tempo , mesmo quando estão executando apenas uma única instrução em uma janela de consulta no SSMS. A maioria das pessoas normalmente fica em algum lugar no meio desses dois limites. Por que vale a pena, os terminadores de instrução têm os mesmos seguidores com muito poucos requisitos obrigatórios. Uma grande parte de tudo isso é o estilo de código , onde não é aplicado (em SSMS e SQLCMD).