本文包含有关使用 T-SQL 循环和替换游标的专用 SQL 池解决方案开发的提示。
Azure Synapse 中的专用 SQL 池支持 WHILE 循环,以便重复执行语句块。 只要指定的条件为真,或直到代码使用 BREAK 关键字专门终止循环,此 WHILE 循环将继续执行。
循环可用于替换 SQL 代码中定义的游标。 幸运的是,几乎所有用 SQL 代码编写的游标都是快速前进且只读类型的。 因此,WHILE 循环是替换游标的绝佳替代方法。
但是,在贸然投入之前,应该问自己以下问题:“是否可以重写这个游标以使用基于集合的操作?”
在许多情况下,答案是肯定的,并且通常是最佳方法。 基于集的操作通常比逐行迭代方法执行得更快。
可以轻松使用循环构造来替换快进只读游标。 以下示例是一个简单的示例。 此代码示例更新数据库中每个表的统计信息。 通过循环遍历表格,每个命令按顺序执行。
首先,创建一个临时表,其中包含用于标识各个语句的唯一行号:
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;
有关更多开发技巧,请参阅 开发概述。