在 Azure Synapse Analytics 中将 T-SQL 循环与 Synapse SQL 配合使用

本文提供了使用 T-SQL 循环、替换游标以及使用 Synapse SQL 开发相关解决方案的基本提示。

WHILE 循环的用途

Synapse SQL 支持用于重复执行的语句块的 WHILE 循环。 只要指定的条件为真,或直到代码使用 BREAK 关键字专门终止循环,此 WHILE 循环将继续执行。

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;

后续步骤

有关更多开发技巧,请参阅 开发概述