Delen via


T-SQL-lussen gebruiken met Synapse SQL in Azure Synapse Analytics

Dit artikel bevat essentiële tips voor het gebruik van T-SQL-lussen, het vervangen van cursors en het ontwikkelen van gerelateerde oplossingen met Synapse SQL.

Doel van WHILE-lussen

Synapse SQL ondersteunt de WHILE-lus voor het herhaaldelijk uitvoeren van instructieblokken. Deze WHILE-lus wordt voortgezet zolang de opgegeven voorwaarden waar zijn of totdat de code de lus specifiek beëindigt met behulp van het trefwoord BREAK.

Lussen in Synapse SQL zijn handig voor het vervangen van cursors die zijn gedefinieerd in SQL-code. Gelukkig zijn bijna alle cursors die in SQL-code zijn geschreven, van de snelle, alleen-lezen variëteit. WHILE-lussen zijn dus een goed alternatief voor het vervangen van cursors.

Cursors vervangen in Synapse SQL

Voordat u ingaat, moet de volgende vraag worden overwogen: 'Kan deze cursor worden herschreven om setgebaseerde bewerkingen te gebruiken?' In veel gevallen is het antwoord ja en is vaak de beste aanpak. Een set-gebaseerde bewerking wordt vaak sneller uitgevoerd dan een iteratieve rij-per-rij benadering.

Snel vooruit lezen cursors worden eenvoudig vervangen door een lusconstructie. De volgende code is een eenvoudig voorbeeld. In dit codevoorbeeld worden de statistieken voor elke tabel in de database bijgewerkt. Door de tabellen in de lus te herhalen, wordt elke opdracht op volgorde uitgevoerd.

Maak eerst een tijdelijke tabel met een uniek rijnummer dat wordt gebruikt om de afzonderlijke instructies te identificeren:

CREATE TABLE #tbl
WITH
( DISTRIBUTION = ROUND_ROBIN
)
AS
SELECT  ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Sequence
,       [name]
,       'UPDATE STATISTICS '+QUOTENAME([name]) AS sql_code
FROM    sys.tables
;

Ten tweede initialiseert u de variabelen die nodig zijn om de lus uit te voeren:

DECLARE @nbr_statements INT = (SELECT COUNT(*) FROM #tbl)
,       @i INT = 1
;

Voer nu achtereenvolgens de instructies één voor één uit.

WHILE   @i <= @nbr_statements
BEGIN
    DECLARE @sql_code NVARCHAR(4000) = (SELECT sql_code FROM #tbl WHERE Sequence = @i);
    EXEC    sp_executesql @sql_code;
    SET     @i +=1;
END

Verwijder ten slotte de tijdelijke tabel die u in de eerste stap hebt gemaakt

DROP TABLE #tbl;

Volgende stappen

Zie ontwikkelingsoverzicht voor meer ontwikkelingstips.