Używanie bloków IF i WHILE do sterowania przepływem programu

Ukończone

Wszystkie języki programowania zawierają elementy, które ułatwiają określenie przepływu programu lub kolejność wykonywania instrukcji. Chociaż T-SQL nie jest tak rozbudowany jak języki takie jak C#, udostępnia zestaw słów kluczowych sterujących przepływem, których można używać do przeprowadzania testów logicznych i tworzenia pętli zawierających instrukcje manipulacji danymi w języku T-SQL. W tej lekcji dowiesz się, jak używać słów kluczowych IF i WHILE języka T-SQL.

Zrozumienie języka sterowania przepływem T-SQL

SQL Server udostępnia elementy składni, które kontrolują przepływ wykonywania programu w partiach instrukcji T-SQL, procedurach składowanych i wielostanowych funkcjach zdefiniowanych przez użytkownika. Te elementy sterowania przepływem oznaczają, że można programowo określić, czy wykonać instrukcje i programowo określić kolejność tych instrukcji, które mają być wykonywane.

Obejmują one następujące elementy, ale nie są ograniczone do następujących elementów:

  • IF...ELSE, który wykonuje kod na podstawie wyrażenia typu Boolean.
  • WHILE, która tworzy pętlę, wykonując ją, gdy warunek ma wartość prawda.
  • BEGIN...END, która definiuje serię instrukcji T-SQL, które powinny być wykonywane razem.
  • Inne słowa kluczowe, na przykład BREAK, CONTINUE, WAITFOR i RETURN, które są używane do obsługi operacji sterowania przepływem języka T-SQL.

Oto przykład instrukcji IF:

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

Użyj logiki warunkowej w programach przy użyciu funkcji IF... INACZEJ

Struktura IF...ELSE jest używana przez T-SQL do warunkowego wykonywania bloku kodu na podstawie warunku. Instrukcja IF określa, czy wykona się następująca instrukcja lub blok (jeśli użyto BEGIN...END). Jeśli predykat zwróci wartość TRUE, zostanie wykonany kod w bloku. Gdy predykat zwraca wartość FALSE lub UNKNOWN, blok nie jest wykonywany, chyba że opcjonalne słowo kluczowe ELSE jest używane do identyfikowania innego bloku kodu.

W poniższej instrukcji IF pytamy bazę danych, czy OBJECT_ID IS NULL, a jeśli tak, zwraca instrukcję PRINT. W tym przykładzie obiekt NIE ma wartości null i dlatego false, co oznacza, że kod BEGIN/END nie zostanie wykonany. Instrukcja PRINT zostanie wykonana tylko wtedy, gdy obiekt nie istnieje w bazie danych.

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;

Ze względu na ograniczenia wynikające z użycia powyższego kodu tylko z instrukcją IF, może to być mylące. Połączenie funkcji IF i ELSE zapewnia większą elastyczność dzięki logice w kodzie i można użyć wielu instrukcji ELSE. W przypadku korzystania z funkcji ELSE istnieje inna opcja wykonywania, gdy predykat IF oblicza wartość FALSE lub UNKNOWN, jak w poniższym przykładzie:

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;

W ramach operacji manipulowania danymi użycie słowa kluczowego IF z słowem kluczowym EXISTS może być przydatnym narzędziem do efektywnego sprawdzania istnienia, jak w poniższym przykładzie:

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

Omówienie pętli przy użyciu instrukcji WHILE

Instrukcja WHILE służy do wykonywania kodu w pętli na podstawie predykatu. Podobnie jak instrukcja IF, instrukcja WHILE określa, czy następująca instrukcja lub blok (jeśli jest używane BEGIN...END) wykonuje się. Pętla będzie nadal wykonywana tak długo, jak warunek ma wartość TRUE. Zazwyczaj można kontrolować pętlę za pomocą zmiennej testowanej przez predykat i manipulować nią w treści samej pętli.

W poniższym przykładzie użyto zmiennej @empid w predykacie i zmienia jej wartość w bloku 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;

Aby uzyskać dodatkowe opcje w pętli WHILE, możesz użyć słów kluczowych CONTINUE i BREAK, aby sterować przepływem.