Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приведены основные советы по использованию циклов 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;
Дальнейшие действия
Дополнительные советы по разработке приведены в обзоре разработки.