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.


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.


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


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.


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.


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


MERGEOświadczenie musi być zakończona średnikiem.
kiedy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.