Compartir vía


Uso de bucles T-SQL para grupos de SQL dedicados en Azure Synapse Analytics

En este artículo se incluyen sugerencias para el desarrollo de soluciones del grupo de SQL dedicado mediante bucles T-SQL y reemplazo de cursores.

Propósito de los bucles WHILE

Los grupos de SQL dedicados en Azure Synapse admiten el bucle WHILE para ejecutar bloques de instrucciones de forma repetida. El bucle WHILE continúa siempre y cuando las condiciones especificadas se cumplan o hasta que el código termine específicamente el bucle con la palabra clave BREAK.

Los bucles son útiles para reemplazar los cursores definidos en código SQL. Afortunadamente, casi todos los cursores que están escritos en código SQL son de la variedad avance rápido y solo lectura. Por lo tanto, los bucles WHILE son una buena alternativa para reemplazar los cursores.

Reemplazo de cursores en el grupo de SQL dedicado

Sin embargo, antes de profundizar en el tema, debe hacerse la siguiente pregunta: "¿Se podría reescribir este cursor para usar operaciones basadas en conjuntos?"

En muchos casos, la respuesta es afirmativa y este suele ser el mejor enfoque. Una operación basada en conjunto a menudo se realiza más rápido que un enfoque iterativo, fila a fila.

Los cursores de avance rápido y solo lectura se pueden reemplazar fácilmente por una construcción de bucle. El ejemplo siguiente es simple. Este código de ejemplo actualiza las estadísticas de todas las tablas de la base de datos. Mediante la iteración a través de las tablas del bucle, cada comando se ejecuta en secuencia.

En primer lugar, cree una tabla temporal que contenga un número de fila único usado para identificar las instrucciones individuales:

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
;

En segundo lugar, inicialice las variables necesarias para realizar el bucle:

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

Ahora, recorra las instrucciones ejecutándolas de una en una:

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

Finalmente, elimine la tabla temporal creada en el primer paso

DROP TABLE #tbl;

Pasos siguientes

Para obtener más sugerencias sobre desarrollo, vea la información general sobre desarrollo.