Cicli in SQL Data WarehouseLoops in SQL Data Warehouse

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. L'esecuzione 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 will continue for as long as the specified conditions are true or until the code specifically terminates the loop using the BREAK keyword. I cicli sono particolarmente utili per la sostituzione di cursori definiti nel codice SQL.Loops are particularly 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. Di conseguenza i cicli WHILE rappresentano un'ottima alternativa se è necessario sostituirne uno.Therefore WHILE loops are a great alternative if you find yourself having to replace one.

Uso di cicli e sostituzione di cursori in SQL Data WarehouseLeveraging loops and replacing 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 re-written to use set based operations?". In molti casi la risposta è Sì ed è spesso l'approccio migliore.In many cases the answer will be yes and is often the best approach. Un'operazione basata su set viene spesso eseguita molto più velocemente rispetto a un approccio iterativo riga per riga.A set based operation often performs significantly 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. Un semplice esempio viene riportato di seguito:Below 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 è possibile eseguire ogni comando in sequenza.By iterating over the tables in the loop we are able to execute each command 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.