Batches beschrijven
T-SQL-batches zijn verzamelingen van een of meer T-SQL-instructies die door een client worden verzonden naar SQL Server als één eenheid. SQL Server werkt op alle instructies in een batch tegelijk bij het parseren, optimaliseren en uitvoeren van de code.
Als u een rapportschrijver bent die doorgaans query's schrijft met behulp van SELECT instructies en geen procedures, is het nog steeds belangrijk om inzicht te hebben in batchgrenzen. Deze grenzen zijn van invloed op uw werk met variabelen en parameters in opgeslagen procedures en andere routines. Een variabele moet bijvoorbeeld worden gedeclareerd in dezelfde batch waarnaar wordt verwezen. Het is daarom belangrijk om te herkennen wat er in een batch is opgenomen.
Batches worden afgebakend door de clientapplicatie. Hoe u het einde van een batch markeert, is afhankelijk van de instellingen van uw client. Voor Microsoft-clients, waaronder SQL Server Management Studio (SSMS) en SQLCMD, is GOhet trefwoord .
In dit voorbeeld zijn er twee afzonderlijke batches die elk worden beëindigd met een GO instructie:
CREATE NEW <view_name>
AS ...
GO
CREATE PROCEDURE <procedure_name>
AS ...
GO
De batcheindpunt-GO is geen T-SQL-trefwoord, maar wordt herkend door SSMS om het einde van een batch aan te geven.
Houd rekening met twee belangrijke overwegingen wanneer u met T-SQL-batches werkt:
- Batches zijn grenzen voor variabele scope, wat betekent dat een variabele die in één batch is gedefinieerd, alleen kan worden verwezen door andere code in dezelfde batch
- Sommige instructies, meestal instructies voor gegevensdefinities, zoals
CREATE VIEW,CREATE FUNCTIONenCREATE PROCEDUREkunnen niet worden gecombineerd met andere in dezelfde batch.
Werken met batches
Een batch is een verzameling T-SQL-instructies die naar SQL Server worden verzonden voor parseren en uitvoeren. Inzicht in hoe batches worden geparseerd, is handig bij het identificeren van foutberichten en het gedrag. Wanneer een batch door een client wordt verzonden, bijvoorbeeld wanneer u op de knop Uitvoeren in SSMS drukt, wordt de batch geparseerd op syntaxisfouten door de SQL Server-engine. Fouten die zijn aangetroffen, hebben tot gevolg dat de hele batch wordt geweigerd; er is geen gedeeltelijke uitvoering van instructies in de batch.
Als de batch de syntaxiscontrole doorloopt, voert SQL Server andere stappen uit, zoals het omzetten van objectnamen, het controleren van machtigingen en het optimaliseren van de code voor uitvoering. Zodra dit proces is voltooid en de uitvoering begint, slagen verklaringen afzonderlijk of mislukken ze. Dit is een belangrijk contrast met syntaxiscontrole. Wanneer een runtimefout op één regel optreedt, kan de volgende regel nog steeds worden uitgevoerd, tenzij u foutafhandeling aan de code toevoegt.
De volgende batch bevat bijvoorbeeld een syntaxisfout:
INSERT INTO dbo.t1 VALUE(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO
Dit foutbericht wordt weergegeven:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'VALUE'.
De fout is opgetreden in regel 1, maar de hele batch wordt geweigerd en de uitvoering gaat niet verder met regel 2. Zelfs als elk van de INSERT instructies werd omgekeerd en de syntaxisfout optrad in de tweede regel, zou de frontline niet worden uitgevoerd omdat de hele batch zou worden geweigerd.
Deze gecorrigeerde batch bevat daarentegen geen fout:
INSERT INTO dbo.t1 VALUES(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO
In de vorige voorbeelden worden INSERT verklaringen gebruikt in plaats van SELECT omdat wijzigingsverklaringen vaker in batches worden gegroepeerd.