Usare cicli T-SQL con Synapse SQL in Azure Synapse Analytics

Questo articolo fornisce suggerimenti essenziali per l'uso di cicli T-SQL, la sostituzione dei cursori e lo sviluppo di soluzioni correlate con Synapse SQL.

Scopo dei cicli WHILE

Synapse SQL supporta il ciclo WHILE per eseguire ripetutamente blocchi di istruzioni. Il ciclo WHILE continua fino a quando le condizioni specificate sono vere o fino a quando il codice termina il ciclo in modo specifico usando la parola chiave BREAK.

I cicli in Synapse SQL sono utili per la sostituzione di cursori definiti nel codice SQL. Per fortuna, quasi tutti i cursori scritti in codice SQL sono del tipo avanzamento rapido, di sola lettura. Di conseguenza, i cicli WHILE sono un'ottima alternativa per sostituire i cursori.

Sostituire i cursori in Synapse SQL

Prima di procedere, è necessario considerare la domanda seguente: "È possibile riscrivere questo cursore per usare operazioni basate su set?" In molti casi la risposta è Sì ed è spesso l'approccio migliore. Un'operazione basata su set viene spesso eseguita più velocemente rispetto a un approccio iterativo riga per riga.

I cursori ad avanzamento rapido di sola lettura possono essere facilmente sostituiti con un costrutto di ciclo. Il codice seguente è un semplice esempio. Questo esempio di codice aggiorna le statistiche per ogni tabella nel database. Scorrendo le tabelle nel ciclo, eseguire ogni comando in sequenza.

Prima di tutto, creare una tabella temporanea contenente un numero di riga univoco usato per identificare le singole istruzioni:

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
;

Inizializzare quindi le variabili necessarie per eseguire il ciclo:

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

Ora eseguire un ciclo delle istruzioni, una alla volta:

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

Infine eliminare la tabella temporanea creata nel primo passaggio.

DROP TABLE #tbl;

Passaggi successivi

Per altri suggerimenti sullo sviluppo, vedere la panoramica dello sviluppo.