Beskriv grupper
T-SQL-grupper er samlinger av én eller flere T-SQL-setninger som sendes til SQL Server av en klient som én enkelt enhet. SQL Server opererer på alle setninger i en gruppe samtidig når du analyserer, optimaliserer og kjører koden.
Hvis du er en rapportskriver som vanligvis skriver forespørsler basert på SELECT uttalelser og ikke prosedyrer, er det fortsatt viktig å forstå batchgrenser. Disse grensene påvirker arbeidet ditt med variabler og parametere i lagrede prosedyrer og andre rutiner. En variabel må for eksempel deklareres i samme gruppe som det refereres til. Det er derfor viktig å gjenkjenne hva som finnes i en gruppe.
Grupper er avgrenset av klientprogrammet. Hvordan du merker slutten av en bunke, avhenger av innstillingene for klienten. For Microsoft-klienter, inkludert SQL Server Management Studio (SSMS) og SQLCMD, er GOnøkkelordet .
I dette eksempelet finnes det to distinkte batcher, hver avsluttet med en GO setning:
CREATE NEW <view_name>
AS ...
GO
CREATE PROCEDURE <procedure_name>
AS ...
GO
Batch terminator GO er ikke et T-SQL-nøkkelord, men er et gjenkjent av SSMS for å indikere slutten på en gruppe.
Husk to viktige hensyn når du jobber med T-SQL-batcher:
- Batches er grenser for variabelomfang, noe som betyr at en variabel definert i én batch kun kan refereres til av annen kode i samme batch
- Noen setninger, typisk datadefinisjonssetninger som
CREATE VIEW,CREATE FUNCTION, kanCREATE PROCEDUREikke kombineres med andre i samme batch.
Arbeide med grupper
En gruppe er en samling av T-SQL-setninger som sendes til SQL Server for analyse og kjøring. Å forstå hvordan batcher analyseres er nyttig for å identifisere feilmeldinger og oppførsel. Når en gruppe sendes inn av en klient, for eksempel når du trykker på Kjør-knappen i SSMS, analyseres bunken for syntaksfeil av SQL Server-motoren. Eventuelle funnede feil fører til at hele batchen blir avvist; Det er ingen delvis utførelse av setninger i batchen.
Hvis bunken passerer syntakskontrollen, kjører SQL Server andre trinn, løser objektnavn, kontrollerer tillatelser og optimaliserer koden for kjøring. Når denne prosessen er fullført og kjøringen begynner, lykkes eller mislykkes setninger enkeltvis. Dette er en viktig kontrast til syntakskontroll. Når en kjørefeil oppstår på én linje, kan neste linje fortsatt kjøres, med mindre du legger til feilhåndtering i koden.
Følgende gruppe inneholder for eksempel en syntaksfeil:
INSERT INTO dbo.t1 VALUE(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO
Den gir denne feilmeldingen:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'VALUE'.
Feilen oppstod i linje 1, men hele bunken avvises, og kjøringen fortsetter ikke med linje 2. Selv om hver av setningene INSERT ble reversert og syntaksfeilen oppsto i den andre linjen, ville ikke frontlinjen blitt utført fordi hele batchen ville bli avvist.
I kontrast inneholder ikke denne korrigerte batchen en feil:
INSERT INTO dbo.t1 VALUES(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO
De tidligere prøvene bruker INSERT setninger i stedet for SELECT fordi modifikasjonssetninger oftere grupperes i batcher.