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.