Udostępnij za pośrednictwem


Używanie pętli T-SQL dla dedykowanych pul SQL w usłudze Azure Synapse Analytics

W tym artykule przedstawiono porady dotyczące tworzenia dedykowanego rozwiązania puli SQL przy użyciu pętli T-SQL i zastępowania kursorów.

Przeznaczenie pętli WHILE

Dedykowane pule SQL w Azure Synapse obsługują 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 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 dedykowanej puli SQL

Jednak przed rozpoczęciem nurkowania w głowę najpierw należy zadać sobie następujące pytanie: "Czy ten kursor może zostać przepisany do korzystania z operacji opartych na zestawie?"

W wielu przypadkach odpowiedź brzmi tak i jest często najlepszym podejściem. Operacja oparta na zestawie często działa szybciej niż iteracyjna, wiersz według podejścia do wiersza.

Szybkie kursory tylko do odczytu można łatwo zastąpić konstrukcją pętli. Poniższy przykład jest prosty. 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.