SQL Server – komenda GO

GO jest komendą SQL Server, a nie poleceniem T-SQL. Informuje serwer o wysłaniu do jego instancji wszystkich poleceń T-SQL podanych przed GO jako jednego polecenia wsadowego( batch) .

GO wystepuje po jednym lub kilku poleceniach T-SQL. Po każdym poleceniu T-SQL stawiamy średnik, po komendzie GO nigdy.  Poniższy przykład pokazuje zestaw poleceń zakończonych komendą GO.

create table person (
  id int primary key,
  name varchar(100) not null
);
insert into person(name) values('Muller');
insert into person(name) values('Davis');
select * from person;
GO

Efekt:

Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'id', table 'BazaTest.dbo.person'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Msg 515, Level 16, State 2, Line 2
Cannot insert the value NULL into column 'id', table 'BazaTest.dbo.person'; column does not allow nulls. INSERT fails.
The statement has been terminated.

(0 row(s) affected)

Ponieważ polecenia  insert zawierały błąd, więc polecenie SELECT nie zostało uruchomione. Dopiero po wprowadzeniu w nich poprawek, polecenie SELECT zostanie uruchomione. Poniższy wsad przedstawia tą sytuację:

insert into person(id,name) values(1,'Muller');
insert into person(id,name) values(2,'Davis');
select * from person;
GO

Wynik:
dd1

 

Polecenia T-SQL nie mogą być wpisywane w tej samej linii co komenda GO:

select * from person;  GO

Wynik:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'GO'.

W linii z GO może być dodany tylko komentarz:

insert into person(id,name) values(5,'Burger');
select * from person;  
GO -- insert one person and select all records

Efekt:
dd2

 

 

Zmienne lokalne tworzone przez użytkownika nie mogą być tworzone i uruchamiane w osobnych wsadach, a więc oddzielnych zestawach z GO:

DECLARE @a int = 12;
GO
SELECT @a;
GO

W wyniku otrzymamy błąd:

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@a".

Poprawiony wsad:

DECLARE @a int = 12;
SELECT @a;
GO

Kilka poleceń wpisanych przed GO jest kompilowane i uruchamiane jako jedno polecenie, wsad.

Istnieje jeszcze wersja GO z podaną po nim liczbą:  GO [count]

Liczba ta musi być całkowita dodatnia. Polecenia podane przed GO tego typu (a więc zawarte w tym samym wsadzie ) będą uruchomione tyle razy na ile wskazuje podana liczba po GO. Oto przykład:

select top 2 * from person;  
GO 3

Result:

 

 

 

 

Komenda GO może być używana do wykonania jednocześnie wielu poleceń typu  insert, a więc wstawienia wielu rekordów do tabeli  jednocześnie, np. w celach testowych. Poniższy przykład pokazuje wstawienie do tabeli 10 wierszy, gdy tabela zawiera tylko jedno pole typu liczby całkowitej w postaci klucza głównego z autoinkrementacją. Jak wstawić dane do tabeli z takim jednym polem?

create table test_tab (
id int primary key identity,
);
GO
insert into test_tab DEFAULT VALUES;
GO 10
select * from test_tab

Wynik:
dd4