Uso di cicli T-SQL in SQL Data WarehouseUsing T-SQL loops in SQL Data Warehouse

Suggerimenti per l'uso di cicli T-SQL e la sostituzione di cursori in Azure SQL Data Warehouse per lo sviluppo di soluzioni.Tips for using T-SQL loops and replacing cursors in Azure SQL Data Warehouse for developing solutions.

Scopo dei cicli WHILEPurpose of WHILE loops

SQL Data Warehouse supporta il ciclo WHILE per eseguire ripetutamente blocchi di istruzioni.SQL Data Warehouse supports the WHILE loop for repeatedly executing statement blocks. 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.This WHILE loop continues for as long as the specified conditions are true or until the code specifically terminates the loop using the BREAK keyword. I cicli sono utili per la sostituzione di cursori definiti nel codice SQL.Loops are useful for replacing cursors defined in SQL code. Per fortuna, quasi tutti i cursori scritti in codice SQL sono del tipo avanzamento rapido, di sola lettura.Fortunately, almost all cursors that are written in SQL code are of the fast forward, read-only variety. Pertanto, i cicli [WHILE] sono un'ottima alternativa per la sostituzione dei cursori.Therefore, [WHILE] loops are a great alternative for replacing cursors.

Sostituzione di cursori in SQL Data WarehouseReplacing cursors in SQL Data Warehouse

Tuttavia, prima di procedere è innanzitutto necessario chiedersi se il cursore può essere riscritto per l'uso di operazioni basate su set.However, before diving in head first you should ask yourself the following question: "Could this cursor be rewritten to use set-based operations?." In molti casi la risposta è Sì ed è spesso l'approccio migliore.In many cases, the answer is yes and is often the best approach. Un'operazione basata su set viene spesso eseguita più velocemente rispetto a un approccio iterativo riga per riga.A set-based operation often performs faster than an iterative, row by row approach.

I cursori ad avanzamento rapido di sola lettura possono essere facilmente sostituiti con un costrutto di ciclo.Fast forward read-only cursors can be easily replaced with a looping construct. Di seguito è riportato un esempio semplice.The following is a simple example. Questo esempio di codice aggiorna le statistiche per ogni tabella nel database.This code example updates the statistics for every table in the database. Scorrendo le tabelle nel ciclo, eseguire ogni comando in sequenza.By iterating over the tables in the loop, each command executes in sequence.

Prima di tutto, creare una tabella temporanea contenente un numero di riga univoco usato per identificare le singole istruzioni:First, create a temporary table containing a unique row number used to identify the individual statements:

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:Second, initialize the variables required to perform the loop:

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

Ora eseguire un ciclo delle istruzioni, una alla volta: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

Infine eliminare la tabella temporanea creata nel primo passaggio.Finally drop the temporary table created in the first step

DROP TABLE #tbl;

Passaggi successiviNext steps

Per altri suggerimenti sullo sviluppo, vedere la panoramica dello sviluppo.For more development tips, see development overview.