Die Transact SQL Auswahlanweisung CASE/ELSE führt in Abhängigkeit von definierten Bedingungen vorgegebene Operationen durch.
Beispiel (Datenbank AdventureWorks):
USE AdventureWorks
GO
SELECT ProductNumber, Name, 'Price Range' =
CASE
WHEN ListPrice = 0 THEN 'Mfg item - not for resale'
WHEN ListPrice < 50 THEN 'Under $50'
WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
ELSE 'Over $1000'
END
FROM Production.Product
ORDER BY ProductNumber
GO
Die im Rumpf der WHILE-Schleife enthaltenen Anweisungen werden solange ausgeführt, bis die Auswertung des Schleifenkopfs false ergibt. Ausser mit der im Kopf definierten Abbruchbedingung, kann die while-Schleife noch mit der Anweisungen break beendet werden. Mit der continue Anweisung kann direkt zum nächsten Schleifendurchlauf gesprungen werden.
Im folgenden Beispiel werden die Preise bei jedem Durchlauf um 15% erhöht. Die Schleife läuft, solange der Durchschnittspreis unter 35 liegt. Wenn ein Artikel einen Preis von mehr als 100 erreicht wird die Schleife mit BREAK abgebrochen.
WHILE (SELECT AVG(price) FROM titles) < 35
BEGIN
UPDATE titles
SET price = price * 1.15
SELECT MAX(price) FROM titles
IF (SELECT MAX(price) FROM titles) > 100
BREAK
ELSE
CONTINUE
END
Um den Owner (Besitzer) eines Objekts innerhalb von SQL Server zu ändern kann die nachfolgende Stored Procedure benutzt werden:
EXEC sp_changeobjectowner 'alterOwner.Objektname', 'neuerOwner'
GO
Mit Hilfe einer WHILE-Schleife können schnell grössere Datenmengen (z.B. für Testzwecke) in eine Tabelle hinzugefügt werden.
SET NOCOUNT ON
DECLARE @i INT
SET @i = 1
WHILE @i <= 1000
BEGIN
INSERT dbo.tabelle1 (id) SELECT @i
SET @i=@i+1
END
GO
Dieses Beispiel fügt der Tabelle dbo.tabelle1 1'000 Datensätze hinzu.
Die Einleitung einer expliziten Transaktion erfolgt durch die folgende Anweisung:
BEGIN TRANSACTION
Sind alle Anweisungen innerhalb der Transaktion erfolgreich bearbeitet worden, muss die Transaktion als gültig gekennzeichnet und in die Datenbank übernommen werden. Mit dem folgenden Befehl wird die Transaktion beendet:
COMMIT TRANSACTION
Ist während der Transaktion ein Fehler aufgetreten, der es erforderlich macht, alle bereits vorgenommenen Änderungen rückgängig zu machen, muss ein Rollback ausgeführt werden, was mit folgender Syntax erreicht wird:
ROLLBACK TRANSACTION
Mit Hilfe eines "normalen" Update-Befehls können Daten von einer Tabelle in die andere kopiert werden.
UPDATE tbl_Mitarbeiter
SET Name = b.Name
,Vorname = b.Vorname
,UserID = b.UserID
,TfNr = b.TfNr
FROM tbl_Mitarbeiter AS a, tbl_Mitarbeiter_new AS b
WHERE a.M_ID = b.M_ID
Mit Hilfe eines Triggers können Änderungen an Tabellen geloggt werden. Nachfolgendes Beispiel überwacht die Änderungen, die innerhalb der Tabelle Employee durchgeführt werden und schreibt den Wert vor der Änderung und den jeweiligen neuen Wert nach Durchführung des Updates in die Tabelle dbo.EmployeeAudit. In der Logtabelle werden im weiteren auch der Zeitpunkt der Änderung wie auch der Benutzer, der das Update durchgeführt hat, abgelegt.
CREATE TRIGGER tr_employeeaudit
ON dbo.Employee
FOR UPDATE
AS
DECLARE @now DATETIME
SET @now = getdate()
BEGIN TRY
INSERT INTO dbo.EmployeeAudit
(RowImage, PayRate, ChangeDate, ChangeUser)
SELECT 'BEFORE', INSERTED.PayRate, @now, suser_sname()
FROM DELETED
INSERT INTO dbo.EmployeeAudit
(RowImage, PayRate, ChangeDate, ChangeUser)
SELECT 'AFTER', INSERTED.PayRate, @now, suser_sname()
FROM INSERTED
END TRY
BEGIN CATCH
-- Fehlerbehandlungscode
ROLLBACK TRANSACTION
END CATCH
Nachfolgendes Konstrukt überprüft den Returncode der auszuführenden StoredProcedure (dbo.spImport). Falls der Vorgang erfolgreich durchgeführt werden konnte wird der Returncode 0 zurückgegeben. Im Fehlerfall wird der Variable @RetCode der Wert 1 zugewiesen und ein RAISERROR mit Schweregrad 16 zurückgegeben. Die Ausführung des Konstruktes wird dann unterbrochen.
DECLARE @RetCode int
EXECUTE @RetCode = dbo.spImport '\\Servername\d$\source.csv'
IF @RetCode = 1
RAISERROR ('Fehler: Die Quelldatei konnte nicht gefunden werden!', 16, 1)
Ab SQL Server 2005 kann die Fehlerbehandlung auch mit TRY und CATCH durchgeführt werden. Innerhalb des Catch-Blockes kann dann individuell auf den Fehler reagiert werden:
BEGIN TRY
-- Fehleranfälliger Code
END TRY
BEGIN CATCH
-- Fehlerbehandlungscode
END CATCH
Mit Hilfe eines Cursors kann auf einzelne Zeilen in einer Tabelle oder einer Ergebnismenge zugegriffen werden und erlaubt so relativ einfach grössere Änderungen an Daten. Nachfolgendes Beispiel führt eine Aktualisierung (Update) für jeden Datensatz in der Tabelle Employee durch (das Attribut CursorModified wird mit dem aktuellen Systemdatum aktualisiert).
DECLARE @EmployeeID int
DECLARE curemp CURSOR FOR SELECT EmployeeID
FROM HumanResources.Employee
OPEN curemp
FETCH curemp INTO @EmployeeID
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE HumanResources.Employee
SET CursorModified = GETDATE()
WHERE EmployeeID = @EmployeeID
FETCH curemp INTO @EmployeeID
END
CLOSE curemp
DEALLOCATE curemp