Поделиться через


Использование циклов T-SQL с Synapse SQL в Azure Synapse Analytics

В этой статье приводятся важные советы по использованию циклов T-SQL, замене курсоров и разработке связанных решений для Synapse SQL.

Назначение циклов WHILE

Synapse SQL позволяет применять цикл WHILE для многократного выполнения блоков операторов. Цикл WHILE продолжается, пока не будут выполнены указанные условия или пока код не прервет цикл с помощью ключевого слова BREAK.

Циклы в Synapse SQL позволяют заменить курсоры, определенные в коде SQL. К счастью, почти все курсоры, записанные в коде SQL, относятся к разряду перемотки и доступности только для чтения. Таким образом, циклы WHILE — отличная альтернатива для замены курсоров.

Замена курсоров в Synapse SQL

Прежде чем углубляться в тему, задайте себе следующий вопрос: "можно ли переписать этот курсор для использования операций на основе наборов?" Во многих случаях ответ на него будет положительным, и часто это и есть оптимальным подходом. Операция, ориентированная на работу с набором данных, нередко работает быстрее, чем итеративный метод построчного перебора.

Однопроходные курсоры только для чтения легко заменяются циклической конструкцией. Ниже приведен простой пример кода. Приведенный в примере код обновляет статистику для каждой таблицы в базе данных. Перебор таблиц в цикле позволяет выполнить каждую команду в последовательности.

Для начала создайте временную таблицу с уникальным номером строки, обозначающим отдельные операторы:

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
;

Затем инициализируйте переменные, необходимые для выполнения цикла:

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

Теперь запустите цикл последовательного выполнения операторов:

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

И, наконец, удалите временную таблицу, созданной на первом этапе:

DROP TABLE #tbl;

Дальнейшие действия

Дополнительные советы по разработке приведены в обзоре разработки.