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 gaat door 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 variant. WHILE-lussen zijn dus een goed alternatief voor het vervangen van cursors.
Cursors vervangen in Synapse SQL
Voordat u erin duikt, moet de volgende vraag worden overwogen: 'Kan deze cursor worden herschreven om bewerkingen op basis van een set te gebruiken?' In veel gevallen is het antwoord ja en vaak de beste aanpak. Een bewerking op basis van een set wordt vaak sneller uitgevoerd dan een iteratieve, rij voor rij-benadering.
Snel voorwaartse alleen-lezen cursors kunnen eenvoudig worden 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 opeenvolgend 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 een lus uit voor instructies die ze één voor één uitvoeren:
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 in de eerste stap is gemaakt
DROP TABLE #tbl;
Volgende stappen
Zie Overzicht van ontwikkeling voor meer tips voor ontwikkeling.