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 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.