Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel vindt u tips voor het ontwikkelen van toegewezen SQL-pools met behulp van T-SQL-lussen en het vervangen van cursors.
Doel van WHILE-lussen
Toegewezen SQL-pools in Azure Synapse ondersteunen 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 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 een toegewezen SQL-pool
Voordat u hals over kop erin duikt, moet u zich echter de volgende vraag stellen: 'Kan deze cursor worden herschreven om set-gebaseerde bewerkingen te gebruiken?'
In veel gevallen is het antwoord ja en is vaak de beste aanpak. Een set-gebaseerde bewerking werkt vaak sneller dan een iteratieve benadering rij voor rij.
Snelle cursors met het kenmerk Alleen-lezen kunnen eenvoudig worden vervangen door een lusconstructie. Het volgende voorbeeld 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.