Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 zadané podmínky pravdivé nebo dokud kód konkrétně neukončí smyčku 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í jsou téměř všechny kurzory napsané v SQL kódu typu fast forward a jen pro čtení. Smyčky WHILE jsou tedy skvělou alternativou pro nahrazení kurzorů.
Nahrazení kurzorů v Synapse SQL
Před potápěním by se měla zvážit následující otázka: "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 je často nejlepším přístupem. Operace založená na sadě se často spouští rychleji než iterativní, řádek po řádku.
Kurzory pro rychlé čtení jsou snadno nahrazeny cyklem. 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 provede postupně.
Nejprve vytvořte dočasnou tabulku obsahující jedinečné číslo řádku sloužící 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ď iterujte přes příkazy a vykonejte je jeden po druhém.
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;