Przeczytałem i przeczytałem przez MSDN itp. Ok, więc sygnalizuje koniec partii.
Co definiuje partię? Nie rozumiem, dlaczego muszę iść, kiedy wklejam kilka skryptów, które mają być uruchomione w tym samym czasie.
Nigdy nie rozumiałem GO. Czy ktoś może to lepiej wytłumaczyć i kiedy muszę z tego skorzystać (po ilu lub jakiego rodzaju transakcjach)?
Na przykład, dlaczego miałbym potrzebować GO po każdej aktualizacji tutaj:
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
go
także resetuje / czyścideclare @foo
deklaracje zmiennych - otrzymywałem, że musisz zadeklarować błędy @foo , dopóki nie skomentowałemgo
.Odpowiedzi:
GO
nie jest poprawnie poleceniem TSQL.Zamiast tego jest to polecenie do konkretnego programu klienckiego, który łączy się z serwerem SQL (Sybase lub Microsoft - nie wiem, co robi Oracle), sygnalizując programowi klienckiemu, że zestaw poleceń wprowadzonych do niego do momentu „rozpoczęcia” będzie wymagał do wysłania na serwer w celu wykonania.
Dlaczego / kiedy tego potrzebujesz?
GO w serwerze MS SQL ma parametr „count” - możesz więc używać go jako skrótu „powtórz N razy”.
Niezwykle duże aktualizacje mogą zapełnić dziennik serwera SQL. Aby tego uniknąć, może być konieczne rozdzielenie ich na mniejsze partie za pomocą
go
.W twoim przykładzie, jeśli aktualizacja zestawu kodów krajów ma taką objętość, że zabraknie miejsca w dzienniku, rozwiązaniem jest rozdzielenie każdego kodu kraju na osobną transakcję - co można zrobić, oddzielając je na kliencie za pomocą
go
.Niektóre instrukcje SQL MUSZĄ być oddzielone znakiem GO od następujących, aby działały.
Na przykład nie można usunąć tabeli i ponownie utworzyć tabeli o tej samej nazwie w jednej transakcji, przynajmniej w Sybase (tak samo jak w przypadku tworzenia procedur / wyzwalaczy):
źródło
GO
nie „tworzy transakcji za Ciebie”. Jeśli nie prowadzisz jawnej transakcji, każda instrukcja i tak utworzy własną transakcję. Jest całkowicie ortogonalny. Jeśli chcesz podzielić większą aktualizację na mniejsze kroki, nadal możesz to zrobić w jednej partii, tak jak w przypadku zwykłegoWHILE @@ROWCOUNT > 0
wzorca.UPDATE T1 SET X =2;UPDATE T1 SET X =2;
będzie działać jako dwóch odrębnych transakcji w każdym razie . Dodanie nieGO
robi żadnej różnicy. I podobnie, jeśli są uruchomione w jawnej transakcji to rozciąga partii i znowuGO
nie robi różnicy.GO
nie ma absolutnie nic wspólnego z transakcjami i sprawia, że odpowiedzi na drugi punkt dotyczący transakcji i rozmiaru pliku dziennika są nieprawidłowe.GO
nie przyniesie żadnego efektu. Pierwsza i trzecia odpowiedź są poprawne. Ponadto czasami trzeba rozdzielić instrukcje na osobne partie, na przykład nie można dodać kolumny do tabeli, a następnie użyć tej kolumny później w tej samej partii. (ciąg dalszy)CREATE VIEW
itp.) Muszą znajdować się we własnej partii.GO
nie jest instrukcją, jest to separator partii.Oddzielone bloki
GO
są wysyłane przez klienta na serwer w celu przetworzenia, a klient czeka na ich wyniki.Na przykład, jeśli piszesz
, zostanie wysłane do serwera jako
3
zapytanie jednowierszowe .Jeśli piszesz
, zostanie to przesłane do serwera jako
3
zapytania jednowierszowe.GO
sama nie trafia na serwer (gra słów nie jest przeznaczona). Jest to słowo zastrzeżone po stronie klienta i jest rozpoznawane tylko przezSSMS
iosql
.Jeśli użyjesz niestandardowego narzędzia do wysyłania zapytań, aby wysłać go przez połączenie, serwer nawet go nie rozpozna i wyświetli błąd.
źródło
CREATE SCHEMA
); inne wymagają, aby były jedynymi oświadczeniami w swoich partiach (jakSET SHOWPLAN_XML ON
)Wiele poleceń musi znajdować się we własnej partii, na przykład
CREATE PROCEDURE
Lub, jeśli dodasz kolumnę do tabeli, powinna znajdować się we własnej partii. Jeśli spróbujesz WYBRAĆ nową kolumnę w tej samej partii, nie powiedzie się, ponieważ w czasie analizy / kompilacji kolumna nie istnieje.
GO jest używane przez narzędzia SQL do rozwiązania tego problemu z jednego skryptu: nie jest to słowo kluczowe SQL i nie jest rozpoznawane przez silnik.
Oto 2 konkretne przykłady codziennego wykorzystania partii.
Edycja: w twoim przykładzie nie potrzebujesz GO ...
Edycja 2, przykład. Nie możesz upuszczać, tworzyć i uprawniać w jednej partii ... nie mniej ważne, gdzie jest koniec procedury składowanej?
źródło
Czasami zachodzi potrzeba wielokrotnego wykonywania tego samego polecenia lub zestawu poleceń. Może to polegać na wstawieniu lub aktualizacji danych testowych lub obciążeniu serwera w celu przeprowadzenia testów wydajności. Niezależnie od potrzeb, najłatwiejszym sposobem jest skonfigurowanie pętli while i wykonanie kodu, ale w SQL 2005 istnieje jeszcze prostszy sposób na zrobienie tego.
Powiedzmy, że chcesz utworzyć tabelę testową i załadować do niej 1000 rekordów. Możesz wydać następujące polecenie, które uruchomi to samo polecenie 1000 razy:
źródło: http://www.mssqltips.com/tip.asp?tip=1216
Poza tym oznacza "koniec" bloku SQL (np. W procedurze składowanej) ... Oznacza to, że ponownie znajdujesz się w stanie "czystym" ... eG: Parametry użyte w instrukcji przed zresetowaniem kodu ( już nie zdefiniowany)
źródło
Jak wszyscy już powiedzieli, „GO” nie jest częścią T-SQL. „GO” to separator wsadowy w programie SSMS , aplikacji klienckiej używanej do przesyłania zapytań do bazy danych. Oznacza to, że zadeklarowane zmienne i zmienne tabelowe nie zostaną zachowane z kodu przed „GO” do kodu następującego po nim.
W rzeczywistości GO jest po prostu domyślnym słowem używanym przez SSMS. Jeśli chcesz, możesz to zmienić w opcjach. Dla odrobiny zabawy zmień opcję w systemie innej osoby tak, aby jako separator wsadowy używał „SELECT” zamiast „GO”. Wybacz mój okrutny chichot.
źródło
Służy do dzielenia bloków logicznych. Twój kod jest interpretowany w linii poleceń sql, co wskazuje na następny blok kodu.
Ale może być użyty jako instrukcja rekurencyjna z określoną liczbą.
Próbować:
Niektóre stwierdzenia muszą być oddzielone przez GO:
źródło