Eu li e li no MSDN, etc. Ok, então sinaliza o final de um lote.
O que define um lote? Não vejo por que preciso ir quando estou colando vários scripts para serem executados ao mesmo tempo.
Eu nunca entendi GO. Alguém pode explicar isso melhor e quando eu preciso usá-lo (depois de quantas ou que tipo de transações)?
Por exemplo, por que eu precisaria do GO após cada atualização aqui:
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
go
também redefine / limpadeclare @foo
declarações de variáveis - eu estava conseguindo que você declarasse erros do @foo , até que comentei ogo
.Respostas:
GO
não é corretamente um comando TSQL.Em vez disso, é um comando para o programa cliente específico que se conecta a um servidor SQL (Sybase ou Microsoft - não tem certeza sobre o que a Oracle faz), sinalizando ao programa cliente que o conjunto de comandos que foram inseridos nele até a necessidade de "ir" para ser enviado ao servidor para ser executado.
Por que / quando você precisa?
O GO no MS SQL Server possui um parâmetro "count" - para que você possa usá-lo como um atalho "repetir N vezes".
Atualizações extremamente grandes podem preencher o log do servidor SQL. Para evitar isso, eles podem precisar ser separados em lotes menores via
go
.No seu exemplo, se a atualização para um conjunto de códigos de países tiver um volume que não excederá o espaço de log, a solução é separar cada código de país em uma transação separada - o que pode ser feito separando-os no cliente
go
.Algumas instruções SQL DEVEM ser separadas pelo GO das seguintes para funcionar.
Por exemplo, você não pode descartar uma tabela e recriar a tabela com o mesmo nome em uma única transação, pelo menos no Sybase (idem para criar procedimentos / gatilhos):
fonte
GO
"não cria uma transação para você." Se você não estiver executando uma transação explícita, cada instrução criará sua própria transação de qualquer maneira. É completamente ortogonal. Se você deseja dividir uma atualização maior em etapas menores, ainda pode fazê-lo em um único lote, como noWHILE @@ROWCOUNT > 0
padrão comum .UPDATE T1 SET X =2;UPDATE T1 SET X =2;
será executado como duas transações separadas de qualquer maneira . A adição de nãoGO
faz absolutamente nenhuma diferença. Da mesma forma, se você estiver executando uma transação explícita, ela abrange lotes e, novamente,GO
não faz diferença.GO
tem absolutamente nada a ver com transações, e coloca as respostas em segundo lugar sobre transações e o tamanho de um arquivo de log incorreto.GO
não terá nenhum efeito. A primeira e a terceira respostas estão corretas. Além disso, há momentos em que você precisa separar as instruções em lotes separados, por exemplo, não é possível adicionar uma coluna a uma tabela e usá-la posteriormente no mesmo lote. (continuação)CREATE VIEW
etc) precisam estar em seu próprio lote.GO
não é uma declaração, é um separador de lotes.Os blocos separados por
GO
são enviados pelo cliente ao servidor para processamento e o cliente aguarda seus resultados.Por exemplo, se você escrever
, isso será enviado ao servidor como uma
3
consulta de linha única .Se você escrever
, isso será enviado ao servidor como
3
consultas de uma linha.GO
em si não vai para o servidor (sem trocadilhos). É uma palavra reservada pura do lado do cliente e é reconhecida apenas porSSMS
eosql
.Se você usar uma ferramenta de consulta personalizada para enviá-la pela conexão, o servidor nem sequer a reconhecerá e emitirá um erro.
fonte
CREATE SCHEMA
); outras exigem sendo as únicas declarações em seus lotes (comoSET SHOWPLAN_XML ON
)Muitos comandos precisam estar em seu próprio lote, como
CREATE PROCEDURE
Ou, se você adicionar uma coluna a uma tabela, ela deverá estar em seu próprio lote. Se você tentar SELECIONAR a nova coluna no mesmo lote, ela falhará porque, no momento da análise / compilação, a coluna não existe.
O GO é usado pelas ferramentas SQL para resolver isso a partir de um script: não é uma palavra-chave SQL e não é reconhecida pelo mecanismo.
Estes são 2 exemplos concretos de uso diário de lotes.
Edit: No seu exemplo, você não precisa de GO ...
Edite 2, exemplo. Você não pode descartar, criar e permissão em um lote ... não menos importante, onde está o fim do procedimento armazenado?
fonte
Às vezes, é necessário executar o mesmo comando ou conjunto de comandos repetidamente. Pode ser para inserir ou atualizar dados de teste ou para colocar uma carga no servidor para teste de desempenho. Qualquer que seja a necessidade, a maneira mais fácil de fazer isso é configurar um loop while e executar seu código, mas no SQL 2005 há uma maneira ainda mais fácil de fazer isso.
Digamos que você queira criar uma tabela de teste e carregá-la com 1000 registros. Você pode emitir o seguinte comando e ele executará o mesmo comando 1000 vezes:
fonte: http://www.mssqltips.com/tip.asp?tip=1216
Fora isso, marca o "fim" de um bloco SQL (por exemplo, em um procedimento armazenado) ... Significando que você está em um estado "limpo" novamente ... eG: Parâmetros usados na instrução antes da redefinição do código ( não está mais definido)
fonte
Como todos já disseram, "GO" não faz parte do T-SQL. "GO" é um separador de lotes no SSMS , um aplicativo cliente usado para enviar consultas ao banco de dados. Isso significa que variáveis declaradas e variáveis de tabela não persistirão do código antes do "GO" para o código após.
De fato, GO é simplesmente a palavra padrão usada pelo SSMS. Isso pode ser alterado nas opções, se você desejar. Para se divertir, altere a opção no sistema de outra pessoa para usar "SELECT" como separador de lotes em vez de "GO". Perdoe minha risada cruel.
fonte
É usado para dividir blocos lógicos. Seu código é interpretado na linha de comando sql e isso indica o próximo bloco de código.
Mas poderia ser usado como declaração recursiva com número específico.
Experimentar:
Alguma declaração deve ser delimitada pelo GO:
fonte