No SQL Server, quando você deve usar GO e quando deve usar ponto e vírgula;?

100

Sempre me confundi quando devo usar a palavra-chave GO após os comandos e se é necessário um ponto-e-vírgula no final dos comandos. Quais são as diferenças e por que / quando devo usá-los?

Quando executo o script Gerar no SQL Server Management Studio, parece que ele usa GO em todos os lugares, mas não o ponto-e-vírgula.

HAdes
fonte

Respostas:

93

GOrefere-se apenas ao SSMS - não é Transact SQL real, apenas informa ao SSMS para enviar as instruções SQL entre cada um GOem lotes individuais sequencialmente.

O ;é um delimitador de instrução SQL, mas na maioria das vezes o mecanismo pode interpretar onde suas instruções estão divididas.

A principal exceção e o local onde o ;é usado com mais frequência é antes de uma instrução de expressão de tabela comum.

cjk
fonte
5
Ênfase na parte GOnão é T-SQL enquanto ;é
msarchet
2
Uma MERGEinstrução deve terminar com um ponto e vírgula.
dia em
15
Atualização: no SQL Server 2012, NÃO usar ponto-e-vírgula está obsoleto, o que significa que eles serão necessários na próxima versão. Portanto, é uma boa prática usar ponto-e-vírgula, pois exigirá menos trabalho no caso de migração (e por ser um padrão). Fonte: technet.microsoft.com/en-us/library/ms143729.aspx ou o livro sobre SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan
1
O SQL 2014 ainda lista ponto-e-vírgula conforme necessário para a próxima versão. Eu me pergunto quando será descontinuado. technet.microsoft.com/en-us/library/ms143729.aspx
Frank
2
+ buli não está informando que ;está obsoleto, NÃO usá-lo está obsoleto, ou seja, vai se tornar obrigatório de acordo com a fonte.
cjk
78

O motivo pelo qual você vê tantos GOs em scripts DDL gerados é por causa da seguinte regra sobre lotes.

As instruções CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, 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 se seguem nesse lote serão interpretadas como parte da definição da primeira instrução CREATE.

Um dos casos de uso para DDL gerado é gerar vários objetos em um único arquivo. Por causa disso, um gerador DDL deve ser capaz de gerar lotes. Como já foi dito, a instrução GO encerra o lote.

Conrad Frix
fonte
10
Este é o único que realmente respondeu "... quando você deve usar GO ...?" parte da questão.
Roimer
Parece-me que GO termina as instruções que criam objetos contendo SQL que podem conter o; terminador de instrução. Em outro DBMS, vi a capacidade de definir a string de terminação. Por exemplo, você pode especificar que as instruções terminam com dois caracteres de barra vertical ||. Você poderia então emitir CREATE PROCEDURE ... muito SQL terminando em; ... || e o pipe duplo termina a instrução CREATE PROCEDURE. Então, minha pergunta é se isso é análogo à declaração do MS GO? Em segundo lugar, você pode redefinir a string de terminação em SQLSERVER?
alcançar em
@youcantryreachingme Não sei se isso era verdade em 2010, mas parece que você pode. Consulte SSMS: Separador de lote . Não tenho certeza de quais são os limites disso
Conrad Frix
34

IR

Go é um separador de lote. Isso significa que tudo naquele lote é local para aquele lote específico.

Quaisquer declarações de variáveis, variáveis ​​de tabela, etc, não passam por GOinstruções.

As tabelas #Temp são locais para uma conexão, portanto, abrangem as instruções GO.

Ponto e vírgula

Um ponto-e-vírgula é um terminador de instrução. Isso é usado exclusivamente para identificar que uma instrução específica terminou.

Na maioria dos casos, a própria sintaxe da instrução é suficiente para determinar o final de uma instrução.

Os CTEs, entretanto, exigem que WITH seja a primeira instrução, portanto, você precisa de um ponto e vírgula antes de WITH.

Raj More
fonte
4
Uma MERGEinstrução deve terminar com um ponto e vírgula.
dia em
11

Você deve usar um ponto-e-vírgula para encerrar todas as instruções SQL. Isso é definido nos padrões SQL,

Claro, na maioria das vezes o SQL Server permite que você omita o terminador de instrução, mas por que adquirir hábitos ruins?

Como outros apontaram, a instrução que precede uma expressão de tabela comum (CTE) deve ser encerrada com um ponto e vírgula. Como consequência, de pessoas que não adotaram totalmente o terminador de ponto e vírgula, vemos o seguinte:

;WITH ...

o que eu acho muito estranho. Suponho que faça sentido em um fórum online quando você não pode dizer a qualidade do código no qual ele será colado.

Além disso, uma MERGEinstrução deve terminar com um ponto e vírgula. Você vê um padrão aqui? Estas são algumas das adições mais recentes ao TSQL que seguem de perto os padrões SQL. Parece que a equipe do SQL Server está seguindo o caminho de obrigar o uso do terminador de ponto e vírgula.

um dia quando
fonte
2
"o que eu acho muito estranho " - eu não poderia concordar mais. E a constante repetição disso leva a perguntas estranhas como esta ou esta
a_horse_with_no_name
O SQL Server não permite que você seja negligente - ele permite que você omita um terminador de instrução redundante; T-SQL, como a maioria dos outros SQLs, não é um SQL padrão puro, que é mais como uma classe base abstrata - não usada na prática em favor do próprio dialeto do mecanismo de banco de dados.
ProfK
@ProfK: obrigado por incluir pontuação em seu comentário, facilitando a leitura e o entendimento, principalmente os caracteres terminadores de frase. Embora o uso de hifens não esteja em conformidade com o inglês padrão ...
dia em
8

GO é um terminador de lote, um ponto e vírgula é um terminador de instrução.

você usará GO quando quiser ter várias instruções create proc em 1 script, porque create proc deve ser a primeira instrução em um lote. Se você usar expressões de tabela comuns, a instrução anterior precisa ser encerrada com um ponto e vírgula

SQLMenace
fonte
Uma MERGEinstrução deve terminar com um ponto e vírgula.
dia em