In SQL Server, quando utilizzare GO e quando utilizzare il punto e virgola;?


100

Sono sempre stato confuso con quando dovrei usare la parola chiave GO dopo i comandi e se è richiesto un punto e virgola alla fine dei comandi. Quali sono le differenze e perché / quando dovrei usarle?

Quando eseguo lo script Generate in SQL Server Management Studio, sembra che utilizzi GO ovunque, ma non il punto e virgola.


Risposte:


93

GOsi riferisce solo a SSMS: non è Transact SQL effettivo, dice semplicemente a SSMS di inviare le istruzioni SQL tra ciascuna GOin singoli batch in sequenza.

Il ;è un delimitatore di un'istruzione SQL, ma per la maggior parte del motore può interpretare in cui le sue dichiarazioni sono interrotte.

L'eccezione principale e il luogo in cui ;viene utilizzato più spesso è prima di un'istruzione Common Table Expression.


5
L'enfasi sulla parte GOnon è T-SQL mentre ;è
msarchet

2
Una MERGEdichiarazione deve essere terminato da un punto e virgola.
quando il

15
Aggiornamento: in SQL Server 2012 NON usare i punti e virgola è deprecato, il che significa che saranno richiesti nella prossima versione. Quindi è una buona pratica usare il punto e virgola, poiché richiederà meno lavoro in caso di migrazione (e perché è uno standard). Fonte: technet.microsoft.com/en-us/library/ms143729.aspx o il libro su SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan

1
SQL 2014 elenca ancora il punto e virgola come richiesto per la prossima versione. Mi chiedo quando sarà deprecato. technet.microsoft.com/en-us/library/ms143729.aspx
Frank

2
+ buli non sta affermando che ;è deprecato, NON usarlo è deprecato, cioè diventerà obbligatorio secondo la fonte.
cjk

78

Il motivo per cui vedi così tanti GO negli script DDL generati è a causa della seguente regola sui batch.

Le istruzioni CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER e CREATE VIEW non possono essere combinate con altre istruzioni in un batch. L'istruzione CREATE deve iniziare il batch. Tutte le altre istruzioni che seguono in quel batch verranno interpretate come parte della definizione della prima istruzione CREATE.

Uno dei casi d'uso per Generated DDL è generare più oggetti in un unico file. Per questo motivo un generatore DDL deve essere in grado di generare batch. Come altri hanno già detto, l'istruzione GO conclude il lotto.


10
Questo è l'unico che ha veramente risposto al "... quando dovresti usare GO ...?" parte della domanda.
Roimer

Mi sembra che GO termini le istruzioni che creano oggetti contenenti SQL che possono contenere il; terminatore di istruzioni. In un altro DBMS ho visto la possibilità di impostare la stringa di terminazione. Ad esempio, potresti specificare che le istruzioni finiscano con due caratteri pipe ||. Si potrebbe quindi emettere CREATE PROCEDURE ... molto SQL che termina con; ... || e il double pipe termina l'istruzione CREATE PROCEDURE. Quindi la mia domanda è se questo è analogo alla dichiarazione MS GO? In secondo luogo, puoi ridefinire la stringa di terminazione in SQLSERVER?
Youucantryreachingme

@youcantryreachingme Non so se questo fosse vero nel 2010 ma sembra che tu possa. Vedere SSMS: separatore batch . Non sono sicuro di quali siano i limiti di questo
Conrad Frix

34

PARTIRE

Go è un separatore di lotti. Ciò significa che tutto in quel batch è locale per quel particolare batch.

Qualsiasi dichiarazione di variabili, variabili di tabella, ecc. Non attraversa le GOistruzioni.

Le tabelle #Temp sono locali rispetto a una connessione, quindi si estendono su tutte le istruzioni GO.

Punto e virgola

Un punto e virgola è un terminatore di istruzione. Viene utilizzato esclusivamente per identificare che una determinata istruzione è terminata.

Nella maggior parte dei casi, la stessa sintassi dell'istruzione è sufficiente per determinare la fine di un'istruzione.

Tuttavia, le CTE richiedono che WITH sia la prima istruzione, quindi è necessario un punto e virgola prima di WITH.


4
Una MERGEdichiarazione deve essere terminato da un punto e virgola.
quando il

11

È necessario utilizzare un punto e virgola per terminare ogni istruzione SQL. Questo è definito negli standard SQL,

Certo, il più delle volte SQL Server ti consente di omettere il terminatore dell'istruzione, ma perché prendere cattive abitudini?

Come altri hanno sottolineato, l'istruzione che precede un'espressione di tabella comune (CTE) deve essere terminata con un punto e virgola. Di conseguenza, da persone che non hanno abbracciato completamente il terminatore punto e virgola, vediamo questo:

;WITH ...

che penso sia davvero strano. Suppongo che abbia senso in un forum online quando non puoi dire la qualità del codice in cui verrà incollato.

Inoltre, MERGEun'istruzione deve essere terminata da un punto e virgola. Vedi uno schema qui? Queste sono un paio delle aggiunte più recenti a TSQL che seguono da vicino gli standard SQL. Sembra che il team di SQL Server stia seguendo la strada per imporre l'uso del terminatore punto e virgola.


2
" che penso sia davvero strano " - non potrei essere più d'accordo. E la costante ripetizione di questo porta a strane domande come questa o questa
a_horse_with_no_name

SQL Server non ti consente di essere sciatto: ti consente di omettere un terminatore di istruzioni ridondante; T-SQL, come la maggior parte degli altri SQL, non è puro SQL standard, che è più simile a una classe base astratta, non utilizzata nella pratica a favore del dialetto del motore DB.
ProfK

@ ProfK: grazie per aver incluso la punteggiatura nel tuo commento, rendendomi più facile leggere e capire, in particolare i caratteri di terminazione della frase. Anche se il tuo utilizzo dei trattini non è conforme allo standard inglese ...
quando il

8

GO è un terminatore batch, un punto e virgola è un terminatore di istruzioni.

utilizzerai GO quando desideri avere più istruzioni create proc in 1 script perché create proc deve essere la prima istruzione in un batch. Se si utilizzano espressioni di tabella comuni, l'istruzione prima di essa deve essere terminata con un punto e virgola


Una MERGEdichiarazione deve essere terminato da un punto e virgola.
quando il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.