Używanie pętli T-SQL z usługą Synapse SQL w usłudze Azure Synapse Analytics

Ten artykuł zawiera podstawowe porady dotyczące używania pętli T-SQL, zastępowania kursorów i opracowywania powiązanych rozwiązań z usługą Synapse SQL.

Przeznaczenie pętli WHILE

Usługa Synapse SQL obsługuje pętlę WHILE do wielokrotnego wykonywania bloków instrukcji. Ta pętla WHILE jest kontynuowana tak długo, jak określone warunki są prawdziwe lub dopóki kod specjalnie nie zakończy pętli przy użyciu słowa kluczowego BREAK.

Pętle w usłudze Synapse SQL są przydatne do zastępowania kursorów zdefiniowanych w kodzie SQL. Na szczęście prawie wszystkie kursory napisane w kodzie SQL są bardzo szybko przekazywane, tylko do odczytu. Pętle WHILE to świetna alternatywa dla zastępowania kursorów.

Zastępowanie kursorów w usłudze Synapse SQL

Przed rozpoczęciem nurkowania należy wziąć pod uwagę następujące pytanie: "Czy ten kursor może zostać przepisany do używania operacji opartych na zestawie?" W wielu przypadkach odpowiedź brzmi tak i jest często najlepszym podejściem. Operacja oparta na zestawie często jest wykonywana szybciej niż iteracyjna, wiersz według podejścia do wiersza.

Szybkie kursory tylko do odczytu są łatwo zastępowane konstrukcją pętli. Poniższy kod jest prostym przykładem. Ten przykładowy kod aktualizuje statystyki dla każdej tabeli w bazie danych. Iterując tabele w pętli, każde polecenie jest wykonywane w sekwencji.

Najpierw utwórz tabelę tymczasową zawierającą unikatowy numer wiersza używany do identyfikowania poszczególnych instrukcji:

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
;

Po drugie zainicjuj zmienne wymagane do wykonania pętli:

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

Teraz pętla na instrukcjach wykonujących je pojedynczo:

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

Na koniec upuść tabelę tymczasową utworzoną w pierwszym kroku

DROP TABLE #tbl;

Następne kroki

Aby uzyskać więcej porad dotyczących programowania, zobacz Omówienie programowania.