W SQL Server, kiedy należy używać GO, a kiedy średnika;?

100

Zawsze byłem zdezorientowany, kiedy powinienem używać słowa kluczowego GO po poleceniach i czy na końcu poleceń wymagany jest średnik. Jakie są różnice i dlaczego / kiedy powinienem ich używać?

Kiedy uruchamiam skrypt Generate w SQL Server Management Studio, wydaje się, że wszędzie używa GO, ale nie średnika.

Hades
źródło

Odpowiedzi:

93

GOodnosi się tylko do SSMS - nie jest to rzeczywisty Transact SQL, po prostu nakazuje SSMS wysyłanie instrukcji SQL między GOposzczególnymi partiami sekwencyjnie.

Jest ;to ogranicznik instrukcji SQL, ale w przeważającej części silnik może zinterpretować miejsce, w którym instrukcje są podzielone.

Główny wyjątek i miejsce, w którym ;najczęściej jest używany, znajduje się przed instrukcją Common Table Expression.

cjk
źródło
5
Nacisk na część GOnie T-SQL, podczas gdy ;jest
msarchet
2
MERGEOświadczenie musi być zakończona średnikiem.
kiedy
15
Aktualizacja: w SQL Server 2012 NIE używanie średników jest przestarzałe, co oznacza, że ​​będą wymagane w następnej wersji. Dlatego dobrą praktyką jest używanie średników, ponieważ będzie to wymagało mniej pracy w przypadku migracji (i jest to standard). Źródło: technet.microsoft.com/en-us/library/ms143729.aspx lub książka o SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan
1
SQL 2014 nadal wyświetla średnik zgodnie z wymaganiami dla następnej wersji. Zastanawiam się, kiedy zostanie wycofany. technet.microsoft.com/en-us/library/ms143729.aspx
Frank,
2
+ buli nie stwierdza, że ;jest przestarzałe, NIE używanie jej jest przestarzałe, tj. stanie się obowiązkowe według źródła.
cjk
78

Powodem, dla którego widzisz tak wiele GO w wygenerowanych skryptach DDL, jest następująca reguła dotycząca partii.

Instrukcje CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER i CREATE VIEW nie mogą być łączone z innymi instrukcjami w partii. Instrukcja CREATE musi rozpoczynać partię. Wszystkie inne instrukcje występujące w tej partii będą interpretowane jako część definicji pierwszej instrukcji CREATE.

Jednym z przypadków użycia Generated DDL jest generowanie wielu obiektów w jednym pliku. Z tego powodu generator DDL musi mieć możliwość generowania partii. Jak powiedzieli inni, instrukcja GO kończy partię.

Conrad Frix
źródło
10
To jedyny, który naprawdę odpowiedział na pytanie „… kiedy należy używać GO…?” część pytania.
Roimer
Wydaje mi się, że GO kończy instrukcje, które tworzą obiekty zawierające SQL, które mogą zawierać; terminator instrukcji. W innym DBMS widziałem możliwość ustawienia ciągu zakończenia. Na przykład możesz określić, że instrukcje kończą się dwoma znakami pionowej kreski ||. Możesz wtedy wydać CREATE PROCEDURE ... wiele SQL kończących się na; ... || a podwójna kreska kończy instrukcję CREATE PROCEDURE. Więc moje pytanie brzmi, czy jest to zgodne z oświadczeniem MS GO? Po drugie, czy możesz ponownie zdefiniować ciąg zakończenia w SQLSERVER?
youcantryreachingme
@youcantryreachingme Nie wiem, czy to była prawda w 2010 roku, ale wydaje się, że możesz. Zobacz SSMS: Separator partii . Nie jestem pewien, jakie to są ograniczenia
Conrad Frix
34

UDAĆ SIĘ

Go to separator partii. Oznacza to, że wszystko w tej partii jest lokalne dla tej konkretnej partii.

Żadne deklaracje zmiennych, zmiennych tabel itp. Nie przechodzą przez GOinstrukcje.

Tabele #Temp są lokalne dla połączenia, więc obejmują wszystkie instrukcje GO.

Średnik

Średnik jest zakończeniem instrukcji. Służy to wyłącznie do stwierdzenia, że ​​określone oświadczenie się zakończyło.

W większości przypadków do określenia końca instrukcji wystarczy sama składnia instrukcji.

CTE wymagają jednak, aby Z było pierwszą instrukcją, więc potrzebujesz średnika przed Dzięki.

Raj Więcej
źródło
4
MERGEOświadczenie musi być zakończona średnikiem.
kiedy
11

Do kończenia każdej instrukcji SQL należy używać średnika. Jest to zdefiniowane w standardach SQL,

Jasne, najczęściej SQL Server pozwala pominąć terminator instrukcji, ale po co wpadać w złe nawyki?

Jak zauważyli inni, instrukcja poprzedzająca wspólne wyrażenie tabeli (CTE) musi być zakończona średnikiem. W konsekwencji od ludzi, którzy nie przyjęli w pełni terminatora średnika, widzimy to:

;WITH ...

co wydaje mi się naprawdę dziwne. Przypuszczam, że ma to sens na forum internetowym, kiedy nie możesz określić jakości kodu, do którego zostanie wklejony.

Ponadto MERGEinstrukcja musi być zakończona średnikiem. Czy widzisz tutaj wzór? Oto kilka nowszych dodatków do TSQL, które są ściśle zgodne ze standardami SQL. Wygląda na to, że zespół SQL Server zmierza w kierunku wprowadzenia obowiązku używania terminatora średnika.

onedaywhen
źródło
2
co wydaje mi się naprawdę dziwne ” - nie mogłem się bardziej zgodzić. A ciągłe powtarzanie tego prowadzi do dziwnych pytań, takich jak to lub to
a_horse_with_no_name
SQL Server nie pozwala na niechlujstwo - pozwala ominąć nadmiarowy terminator instrukcji; T-SQL, podobnie jak większość innych SQL, nie jest czystym standardowym SQL, który bardziej przypomina abstrakcyjną klasę bazową - nie jest używany w praktyce na rzecz własnego dialektu silnika DB.
ProfK
@ProfK: dziękuję za uwzględnienie interpunkcji w komentarzu, co ułatwia mi czytanie i rozumienie, zwłaszcza znaków terminatora zdań. Chociaż, twoje użycie myślników nie jest zgodne ze standardowym angielskim ...
kiedy
8

GO to terminator partii, średnik to terminator instrukcji.

użyjesz GO, jeśli chcesz mieć wiele instrukcji create proc w jednym skrypcie, ponieważ create proc musi być pierwszą instrukcją w partii. Jeśli używasz typowych wyrażeń tabelarycznych, instrukcja poprzedzająca musi być zakończona średnikiem

SQLMenace
źródło
MERGEOświadczenie musi być zakończona średnikiem.
kiedy