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


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

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

Purpose of WHILE loops

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
;

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

Наконец, удалите временную таблицу, созданную на первом шаге

DROP TABLE #tbl;

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

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