Usare i blocchi IF e WHILE per controllare il flusso del programma

Completato

Tutti i linguaggi di programmazione includono elementi che consentono di determinare il flusso del programma o l'ordine in cui vengono eseguite le istruzioni. Sebbene non sia completamente in primo piano come linguaggi come C#, T-SQL offre un set di parole chiave control-of-flow che è possibile usare per eseguire test logici e creare cicli contenenti le istruzioni di manipolazione dei dati T-SQL. In questa lezione si apprenderà come usare le parole chiave T-SQL IF e WHILE.

Comprendere il controllo di flusso di T-SQL

SQL Server fornisce elementi del linguaggio che controllano il flusso di esecuzione del programma all'interno di batch T-SQL, stored procedure e funzioni definite dall'utente con più stati. Questi elementi di controllo del flusso indicano che è possibile determinare a livello di codice se eseguire istruzioni e determinare a livello di codice l'ordine di tali istruzioni che devono essere eseguite.

Questi elementi includono, ma non sono limitati a:

  • SE... ELSE, che esegue il codice basato su un'espressione booleana.
  • WHILE, che crea un ciclo che viene eseguito purché una condizione sia vera.
  • BEGIN...END, che definisce una serie di istruzioni T-SQL che devono essere eseguite insieme.
  • Altre parole chiave, ad esempio BREAK, CONTINUE, WAITFOR e RETURN, che vengono usate per supportare le operazioni di flusso di controllo T-SQL.

Di seguito è riportato un esempio dell'istruzione IF:

IF OBJECT_ID('dbo.tl') IS NOT NULL
    DROP TABLE dbo.tl
GO

Usare la logica condizionale nei programmi usando IF... ALTRO

L'IF... La struttura ELSE viene usata in T-SQL per eseguire in modo condizionale un blocco di codice basato su un predicato. L'istruzione IF determina se l'istruzione o il blocco seguente (se BEGIN... END viene usato) viene eseguito. Se il predicato restituisce TRUE, viene eseguito il codice nel blocco. Quando il predicato restituisce FALSE o UNKNOWN, il blocco non viene eseguito, a meno che non venga usata la parola chiave ELSE facoltativa per identificare un altro blocco di codice.

Nell'istruzione IF seguente viene chiesto al database se il OBJECT_ID è NULL e, in tal caso, restituire l'istruzione PRINT. In questo esempio, l'oggetto non è Null e pertanto FALSE, il che significa che il codice BEGIN/END non verrà eseguito. L'istruzione PRINT verrà eseguita solo se l'oggetto non esiste nel database.

USE TSQL;
GO
IF OBJECT_ID('HR.Employees') IS NULL --this object does exist in the sample database
BEGIN
    PRINT 'The specified object does not exist';
END;

A causa delle limitazioni del codice precedente con solo un'istruzione IF, ciò può generare confusione. La combinazione di IF e ELSE offre maggiore flessibilità con la logica nel codice ed è possibile usare più istruzioni ELSE. Con l'uso di ELSE, è disponibile un'altra opzione di esecuzione quando il predicato IF restituisce FALSE o UNKNOWN, come nell'esempio seguente:

IF OBJECT_ID('HR.Employees') IS NULL --this object does exist in the sample database
BEGIN
    PRINT 'The specified object does not exist';
END
ELSE
BEGIN
    PRINT 'The specified object exists';
END;

Nelle operazioni di manipolazione dei dati, l'uso di IF con la parola chiave EXISTS può essere uno strumento utile per controlli di esistenza efficienti, come nell'esempio seguente:

IF EXISTS (SELECT * FROM Sales.EmpOrders WHERE empid =5)
BEGIN
    PRINT 'Employee has associated orders';
END;

Informazioni sulla riproduzione a ciclo continuo tramite le istruzioni WHILE

L'istruzione WHILE viene usata per eseguire il codice in un ciclo basato su un predicato. Analogamente all'istruzione IF, l'istruzione WHILE determina se l'istruzione o il blocco seguente (se BEGIN... END viene usato) viene eseguito. L'esecuzione del ciclo continua finché la condizione restituisce TRUE. In genere, si controlla il ciclo con una variabile testata dal predicato e manipolata nel corpo del ciclo stesso.

L'esempio seguente usa la variabile @empid all'interno del predicato e ne modifica il valore nel blocco BEGIN...END.

DECLARE @empid AS INT = 1, @lname AS NVARCHAR(20);
WHILE @empid <=5
   BEGIN
	SELECT @lname = lastname FROM HR.Employees
		WHERE empid = @empid;
	PRINT @lname;
	SET @empid += 1;
   END;

Per opzioni aggiuntive all'interno di un ciclo WHILE, è possibile usare le parole chiave CONTINUE e BREAK per controllare il flusso.