Dela via


Använda T-SQL-loopar för dedikerade SQL-pooler i Azure Synapse Analytics

I den här artikeln finns tips för dedikerad utveckling av SQL-poollösningar med hjälp av T-SQL-loopar och byte 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 de angivna villkoren är sanna eller tills koden uttryckligen avslutar loopen med hjälp av 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 snabbsnabba, skrivskyddade 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 själv 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 uppsättningsbaserad åtgärd utförs ofta snabbare än en iterativ, rad för rad-metod.

Snabbslinga 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 instruktioner som kö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.