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 / 59975
Accepted
TheIdiot
TheIdiot
Asked: 2014-03-02 07:29:32 +0800 CST2014-03-02 07:29:32 +0800 CST 2014-03-02 07:29:32 +0800 CST

GO Após cada instrução T-SQL

  • 772

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?

sql-server performance
  • 1 1 respostas
  • 32193 Views

1 respostas

  • Voted
  1. Best Answer
    Thomas Stringer
    2014-03-02T08:33:26+08:002014-03-02T08:33:26+08:00

    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":

    insira a descrição da imagem aqui

    Essa captura de tela acima é uma opção configurável no SSMS.

    Mas o que é um lote?? Esta referência BOL diz melhor:

    Um lote é um grupo de uma ou mais instruções Transact-SQL enviadas ao mesmo tempo de um aplicativo para o SQL Server para execução.

    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:

    $ConnectionString = "data source = SomeSQLInstance; initial catalog = AdventureWorks2012; trusted_connection = true; application name = BatchTesting;"
    
    try {
        $SqlConnection = New-Object System.Data.SqlClient.SqlConnection($ConnectionString)
        $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
        $SqlCmd.Connection = $SqlConnection
    
        # first batch of statements
        #
        $SqlCmd.CommandText = "
            select * from humanresources.department where departmentid = 1;
            select * from humanresources.department where departmentid = 2;
            select * from humanresources.department where departmentid = 3;
            select * from humanresources.department where departmentid = 4;"
    
        # execute the first batch
        #
        $SqlConnection.Open()
        $SqlCmd.ExecuteNonQuery()
        $SqlConnection.Close()
    
        # second batch of statements
        #
        $SqlCmd.CommandText = "
            select * from humanresources.department where departmentid = 5;
            select * from humanresources.department where departmentid = 6;
            select * from humanresources.department where departmentid = 7;
            select * from humanresources.department where departmentid = 8;"
    
        # execute the second batch
        #
        $SqlConnection.Open()
        $SqlCmd.ExecuteNonQuery()
        $SqlConnection.Close()
    }
    catch {
        $SqlCmd.Dispose()
        $SqlConnection.Dispose()
        Write-Error $_.Exception
    }
    

    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:

    create event session BatchTesting
    on server
    add event sqlserver.sql_batch_starting
    (
        set
            collect_batch_text = 1
        where
        (
            sqlserver.client_app_name = N'BatchTesting'
        )
    ),
    add event sqlserver.sql_batch_completed
    (
        set
            collect_batch_text = 1
        where
        (
            sqlserver.client_app_name = N'BatchTesting'
        )
    ),
    add event sqlserver.sql_statement_starting
    (
        set
            collect_statement = 1
        where
        (
            sqlserver.client_app_name = N'BatchTesting'
        )
    ),
    add event sqlserver.sql_statement_completed
    (
        set
            collect_statement = 1
        where
        (
            sqlserver.client_app_name = N'BatchTesting'
        )
    )
    add target package0.event_file
    (
        set
            filename = N'<MyXelLocation>\BatchTesting.xel'
    );
    go
    
    alter event session BatchTesting
    on server
    state = start;
    go
    

    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:

    insira a descrição da imagem aqui

    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_textprimeira ocorrência de sql_batch_starting, podemos ver todas as instruções incluídas nesse lote:

        select * from humanresources.department where departmentid = 1;
        select * from humanresources.department where departmentid = 2;
        select * from humanresources.department where departmentid = 3;
        select * from humanresources.department where departmentid = 4;
    

    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 :

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

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

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

    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).

    • 56

relate perguntas

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

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

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

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