Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln finns tips för utveckling av dedikerade SQL-poollösningar med hjälp av T-SQL-loopar och ersättning av markörer.
Syftet med WHILE-loopar
Dedikerade SQL-pooler i Azure Synapse stöder WHILE-loopen för upprepade körning av instruktionsblock. Den här WHILE-loopen fortsätter så länge som de angivna villkoren är sanna eller tills koden specifikt avslutar loopen med nyckelordet BREAK.
Loopar är användbara för att ersätta markörer som definierats i SQL-kod. Lyckligtvis är nästan alla markörer som skrivs i SQL-kod av den framåtpekande, endast läsbara sorten. Så WHILE-loopar är ett bra alternativ för att ersätta markörer.
Ersätta markörer i en dedikerad SQL-pool
Men innan du dyker i huvudet först bör du ställa dig följande fråga: "Kan den här markören skrivas om för att använda set-baserade åtgärder?"
I många fall är svaret ja och är ofta den bästa metoden. En mängdbaserad operation utförs ofta snabbare än en iterativ, rad för rad metod.
Snabbsnabb framåt skrivskyddade markörer kan enkelt ersättas med en loopkonstruktion. Följande exempel är enkelt. Det här kodexemplet uppdaterar statistiken för varje tabell i databasen. Genom att iterera över tabellerna i loopen körs varje kommando i följd.
Skapa först en tillfällig tabell som innehåller ett unikt radnummer som används för att identifiera de enskilda uttrycken:
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
;
För det andra initierar du de variabler som krävs för att utföra loopen:
DECLARE @nbr_statements INT = (SELECT COUNT(*) FROM #tbl)
, @i INT = 1
;
Loopa nu över instruktionerna och utför dem en i taget:
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
Ta slutligen bort den temporära tabell som skapades i det första steget
DROP TABLE #tbl;
Nästa steg
Fler utvecklingstips finns i utvecklingsöversikt.