AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 283022
Accepted
Danilo Matrangolo Marano
Danilo Matrangolo Marano
Asked: 2021-01-12 14:44:35 +0800 CST2021-01-12 14:44:35 +0800 CST 2021-01-12 14:44:35 +0800 CST

O que a instrução GO faz no SQL Server?

  • 772

A GOdeclaração do SQL Server me causou grande curiosidade e não sei muito como usá-la corretamente.

Percebi que consultas com ou sem GOnão retornam erros e parecem funcionar da mesma forma, então qual é o propósito disso e por que devo usá-lo?

E qual é a diferença entre ponto e vírgula ;e GOno final de uma consulta?

sql-server
  • 5 5 respostas
  • 10540 Views

5 respostas

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2021-01-12T14:51:14+08:002021-01-12T14:51:14+08:00

    GOnão faz parte da linguagem TSQL. É um separador de lote usado pelo SQLCMD e SSMS.

    GO não é uma instrução Transact-SQL; é um comando reconhecido pelos utilitários sqlcmd e osql e pelo editor de código do SQL Server Management Studio.

    Os utilitários do SQL Server interpretam GO como um sinal de que eles devem enviar o lote atual de instruções Transact-SQL para uma instância do SQL Server. O lote atual de instruções é composto por todas as instruções inseridas desde o último GO, ou desde o início da sessão ou script ad hoc, se este for o primeiro GO.

    Uma instrução Transact-SQL não pode ocupar a mesma linha que um comando GO. No entanto, a linha pode conter comentários.

    Instruções de Utilitários do SQL Server - GO

    Originou-se com as interfaces de linha de comando e persiste no sqlcmd até hoje. Você pode gravar um lote em várias linhas na interface de linha de comando e o lote não é enviado ao servidor até que você digite go.

    1> select name, create_date
    2> from sys.objects
    3> where name = 'foo'
    4> go
    name      create_date
    --------- -----------
    foo       2020-07-20 09:56:42.393
    
    (1 rows affected)
    1>
    

    Você pode configurar o que usar para um separador de lote no SSMS. GOé o padrão, mas pode ser qualquer outra coisa.

    NOZES

    • 80
  2. Vladislav Zalesak
    2021-01-12T14:45:37+08:002021-01-12T14:45:37+08:00

    Ele divide o comando em lotes individuais.

    Por exemplo, o escopo das variáveis ​​termina com GO.

    ;separa comandos, mas não encerra o escopo.
    GOsepara os lotes e encerra o escopo.

    Você pode pensar nisso como se todo o comando fosse dividido GOe cada parte fosse executada por si só.

    ou seja.

    Isso funciona:

    declare @a int;
    set @a = 1;
    select @a
    

    Mas isso não funciona:

    declare @a int
    set @a = 1
    GO
    select @a -- will throw error as variable is not declared
    
    • 25
  3. Francesco Mantovani
    2021-01-13T14:16:03+08:002021-01-13T14:16:03+08:00

    Estas são as explicações:

    • ;= É um terminador de instrução . Não é obrigatório , mas pode ser um dia . por enquanto você DEVE usá-lo em duas situações:
    1. Em uma expressão de tabela comum (CTE), em que a CTE não é a primeira instrução do lote.
    2. Quando você emite uma instrução do Service Broker e a instrução do Service Broker não é a primeira instrução do lote.
    • GO= É um separador de lote . Ele diz ao SQL Server "pare aqui e execute todo o código anterior antes de prosseguir" . Não é obrigatório, mas há um recurso para você: se você escrever GO 10, GO 100, GO 1000ele executará o mesmo lote de código 10, 100, 1000vezes

      GOnão significa nada para o próprio SQL Server, mas é interpretado pelas ferramentas (como SSMS ou SQLCMD) que enviam seus scripts para o SQL Server. Algumas outras ferramentas podem não entender 'GO'. Algumas ferramentas interpretam GOum pouco diferente. No SSMS, cada lote é executado na mesma sessão para que as transações possam abranger lotes, pelo menos algumas das ferramentas de linha de comando incluídas no SQL Server não mantêm a mesma sessão para cada lote em um arquivo, portanto, uma transação aberta será revertida quando GO é encontrado.

    • 14
  4. Tibor Karaszi
    2021-01-13T00:33:06+08:002021-01-13T00:33:06+08:00

    GO foi bem abordado em outras respostas. Deixe-me adicionar alguns sobre ponto e vírgula:

    Há muito tempo atrás, isso não era algo que usávamos. Mas o padrão SQL (ANSI/ISO SQL) especificava que uma instrução SQL deveria terminar com ponto e vírgula. Assim, em uma determinada versão, a MS permitiu que ela obedecesse ao ANSI SQL. Mas era, e principalmente ainda é, um no-op. Ou seja, não faz diferença se você tem ou não

    Eu não estava envolvido quando a linguagem SQL foi inventada (eu era criança), mas posso imaginar que o ponto e vírgula foi especificado como um terminador de instrução para simplificar a análise do SQL. Ou seja, quando você envia SQL para o mecanismo db, ele primeiro precisa analisar (entender o que você disse, basicamente) a(s) instrução(ões). Você provavelmente pode imaginar que seria mais fácil para o código de análise no mecanismo se ele pudesse procurar algum caractere específico que significa "fim de instrução". Daí ponto e vírgula. Mas, como observei, o SQL Server não usava ponto e vírgula para análise.

    Agora, com o tempo, alguns novos elementos de linguagem que foram introduzidos exigiram que a instrução anterior fosse terminada com ponto e vírgula (WITH como em CTE e THROW sendo dois exemplos). Sem ele, o SQL Server não conseguiu analisar (entenda o que você disse) e você obteve um erro gerado na fase de análise.

    Ao mesmo tempo, o MS disse que não terminar uma declaração com ponto e vírgula era obsoleto. Ou seja, eles tentaram nos fazer acreditar que em algum momento (alguma versão futura), temos que terminar todas as nossas declarações com ponto e vírgula. Eu provavelmente não fui o único que achou isso um pouco divertido - imagine os aspectos de compatibilidade com versões anteriores! Pulando para o tempo presente, se você ler a documentação, descobrirá que esse não é mais o caso (na verdade, não há recursos obsoletos hoje - nenhum!).

    • 9
  5. Trupti J
    2021-05-20T22:25:21+08:002021-05-20T22:25:21+08:00

    Eu gostaria de acrescentar aqui que, se você adicionar a instrução Go entre instruções diferentes, ela continuará executando suas consultas, independentemente de qualquer erro lançado. Se você pular a instrução Go, sua execução será interrompida após qualquer erro e as próximas instruções não serão executadas. O melhor caso de uso, por exemplo, se você tiver várias instruções de inserção e quiser continuar sua execução se houver algum erro em sua instrução de inserção (você deseja apenas os logs de execução talvez), escreva este separador de lote. Se você deseja interromper a execução na instrução onde há um erro, deseja fazer algumas alterações e continuar a execução posteriormente, não escreva GO separator.

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve