Sdílet prostřednictvím


Použití smyček T-SQL se Synapse SQL v Azure Synapse Analytics

Tento článek obsahuje základní tipy pro používání smyček T-SQL, nahrazení kurzorů a vývoj souvisejících řešení pomocí Synapse SQL.

Účel smyček WHILE

Synapse SQL podporuje smyčku WHILE pro opakované spouštění bloků příkazů. Tato smyčka WHILE pokračuje tak dlouho, dokud jsou splněné zadané podmínky, nebo dokud kód smyčku výslovně neukončí pomocí klíčového slova BREAK.

Smyčky v Synapse SQL jsou užitečné pro nahrazení kurzorů definovaných v kódu SQL. Naštěstí téměř všechny kurzory, které jsou napsané v kódu SQL, jsou rychle vpřed a jen pro čtení. Smyčky WHILE jsou tedy skvělou alternativou pro nahrazení kurzorů.

Nahrazení kurzorů v Synapse SQL

Než se ponoříte, měli byste zvážit následující otázku: "Mohl by být tento kurzor přepsán tak, aby používal operace založené na sadě?" V mnoha případech je odpověď ano a často se jedná o nejlepší přístup. Operace založená na sadách se často provádí rychleji než iterativní přístup řádek po řádku.

Rychlé kurzory jen pro čtení jsou snadno nahrazeny konstruktorem smyčky. Následující kód je jednoduchý příklad. Tento příklad kódu aktualizuje statistiky pro každou tabulku v databázi. Iterací tabulek ve smyčce se každý příkaz spustí postupně.

Nejprve vytvořte dočasnou tabulku obsahující jedinečné číslo řádku, které slouží k identifikaci jednotlivých příkazů:

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
;

Za druhé inicializace proměnných potřebných ke spuštění smyčky:

DECLARE @nbr_statements INT = (SELECT COUNT(*) FROM #tbl)
,       @i INT = 1
;

Teď můžete opakovaně procházet příkazy, které je postupně spouštějí:

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

Nakonec vypusťte dočasnou tabulku vytvořenou v prvním kroku.

DROP TABLE #tbl;

Další kroky

Další tipy pro vývoj najdete v přehledu vývoje.