czwartek, 27 czerwca 2013

GO - różnica wykonania między wersją 2000, a wyższymi

Polecenie GO nie jest poleceniem Transact-SQL. Jest używane przez narzędzia serwera SQL, takie, jak:
  • sqlcmd
  • osql
  • SQL Server Management Studio Core
  • Toad for SQL Server
Każde z tych narzędzi interpretuje wystąpienie GO jako sygnał, że powinno wysłać bieżący skrypt z poleceniami Transact-SQL do instancji serwera SQL. Warto nadmienić, że za skrypt uważa się wszystkie polecenia, począwszy od wystąpienia ostatniego polecenia GO, lub od rozpoczęcia sesji ad hoc lub jeżeli jest to pierwsze wystąpienie polecenia GO.
-- początek
-- początek pierwszego skryptu
USE [Healthy];
GO -- wykonanie pierwszego skryptu
-- początek drugiego skryptu
CREATE TABLE dbo.[Hospitals](
     [Id] IDENTITY(0, 1) TINYINT NOT NULL
   , [Name] NVARCHAR(255) NOT NULL);
GO -- wykonanie drugiego skryptu
-- początek trzeciego skryptu
INSERT INTO dbo.[Hospitals]([Name]) VALUES(N'Szpital Bielański');
INSERT INTO dbo.[Hospitals]([Name]) VALUES(N'Centralny Szpital Kliniczny MSWiA');
INSERT INTO dbo.[Hospitals]([Name]) VALUES(N'Instytut Hematologii i Transfuzjologii');
INSERT INTO dbo.[Hospitals]([Name]) VALUES(N'Instytut Kardiologii');
GO -- wykonanie trzeciego skryptu
-- koniec

Polecenie Transact-SQL nie może być w tej samej linii, co GO.
GO select * from dbo.Hospitals; -- nic nie zwróci (wersja 2000)


GO; SELECT * FROM dbo.Hospitals; 
-- Could not find stored procedure 'GO'
-- zwróci dane z polecenia SELECT

SELECT * FROM dbo.Hospitals;GO; -- Incorrect syntax near 'GO'
SELECT * FROM dbo.Hospitals;GO -- Incorrect syntax near 'GO'

Ale komentarz może się znajdować za GO
GO -- komentarz

Zasięg zmiennych, zdefiniowanych przez użytkownika, jest ograniczony do skryptu, co widać poniżej


DECLARE @i TINYINT;
SET @i = 5;
PRINT @i; -- 5
GO -- wykonanie skryptu
PRINT @i; -- Must declare the variable '@i'
GO

Należy również pamiętać, że jeżeli wywołujemy procedurę składowaną nie jako pierwsze polecenie skryptu, lecz następne, musimy dołączyć słowo kluczowe EXECUTE (lub EXEC).


USE [Healthy];
GO
CREATE PROCEDURE [dbo].Greeting 
AS
     SELECT 'Hello';
GO
Greeting; -- Hello
GO
DECLARE @i TINYINT;
EXEC Greeting; -- Hello
GO
DECLARE @i TINYINT;
Greeting; -- Incorrect syntax near 'Greeting'
GO

Rozbieżność między wersją 2000 a wyższą jest taka, że od począwszy od wersji 2005 skrypt można powtarzać.


USE [Healthy];
GO
CREATE TABLE [dbo].[Test](var TINYINT);
GO
INSERT INTO [dbo].[Test](var) VALUES(5);
GO 7 -- wersja 2000 zignoruje 7, od 2005 wykona polecenie INSERT 7 razy

W wersji 2000, w większości przypadków, ten problem obejdziemy przy pomocy pętli WHILE


USE [Healthy];
GO
CREATE TABLE [dbo].[Test](var TINYINT);
GO
DECLARE @count TINYINT;
SET @count = 0;
WHILE @count < 7
BEGIN
  INSERT INTO [dbo].[Test](var) VALUES(5);
  SET @count = @count + 1;
END
GO


Brak komentarzy:

Prześlij komentarz