Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł zawiera podstawowe wskazówki dotyczące używania pętli T-SQL, zastępowania kursorów i opracowywania powiązanych rozwiązań z usługą Synapse SQL.
Purpose of WHILE loops
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. Fortunately, almost all cursors that are written in SQL code are of the fast forward, read-only variety. Pętle WHILE są więc doskonałą alternatywą dla zastępowania kursorów.
Zamienianie kursorów w usłudze Synapse SQL
Przed rozpoczęciem nurkowania należy rozważyć następujące pytanie: "Czy ten kursor może zostać przepisany do użycia operacji opartych na zestawie?" W wielu przypadkach odpowiedź brzmi tak i często jest najlepszym podejściem. Operacja oparta na zestawie jest często wykonywana szybciej niż metoda iteracyjna, wiersz po wierszu.
Fast forward read-only cursors are easily replaced with a looping construct. 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 służący do identyfikowania poszczególnych zapytań:
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
;
Now loop over statements executing them one at a time:
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.