Gespeicherte Prozeduren in AdventureWorks
Die AdventureWorks-OLTP-Beispieldatenbank umfasst verschiedene gespeicherte Transact-SQL-Prozeduren. Beispiele für CLR-gespeicherte Prozeduren (Common Language Runtime) können Sie unter Microsoft SQL Server Samples and Community Projects herunterladen.
CLR-gespeicherte Prozeduren
In der folgenden Tabelle sind Beispiele für die verfügbaren CLR-gespeicherten Prozeduren aufgeführt. Weitere Informationen zu CLR-gespeicherten Prozeduren finden Sie unter CLR-gespeicherte Prozeduren.
Beispiel |
Beschreibung |
---|---|
AdventureWorks Cycles CLR Layer |
Eine C#-basierte gespeicherte Prozedur, die xml-Daten als Eingabe erfordert und die Daten in Spalten der Person.Contact-Tabelle einfügt. |
Gespeicherte Prozeduren in Transact-SQL
In der folgenden Tabelle sind die Transact-SQL-gespeicherten Prozeduren aufgelistet, die in der AdventureWorks-OLTP-Beispieldatenbank enthalten sind. Weitere Informationen zu gespeicherten Prozeduren in Transact-SQL finden Sie unter Grundlegendes zu gespeicherten Prozeduren.
Gespeicherte Prozedur |
Beschreibung |
Eingabeparameter |
---|---|---|
dbo.uspGetBillOfMaterials |
Verwendet eine rekursive Abfrage (allgemeiner Tabellenausdruck), um eine mehrstufige Stückliste zu generieren: alle Bauteile der Ebene 1 einer Baugruppe der Ebene 0 und alle Bauteile der Ebene 2 einer Baugruppe der Ebene 1 usw. |
@StartProductIDint @CheckDatedatetime |
dbo.uspGetEmployeeManagers |
Verwendet eine rekursive Abfrage (allgemeiner Tabellenausdruck), um die direkten und indirekten Vorgesetzten eines bestimmten Mitarbeiters zurückzugeben. |
@EmployeeIDint |
dbo.uspGetManagerEmployees |
Verwendet eine rekursive Abfrage (allgemeiner Tabellenausdruck), um die direkten und indirekten Mitarbeiter eines bestimmten Vorgesetzten zurückzugeben. |
@ManagerIDint |
dbo.uspLogError |
Protokolliert Fehlerinformationen in der dbo.ErrorLog-Tabelle zu dem Fehler, der dazu geführt hat, dass die Ausführung zum CATCH-Block eines TRY...CATCH-Konstrukts gesprungen ist. Diese Prozedur sollte aus dem Bereich eines CATCH-Blocks heraus ausgeführt werden, da andernfalls keine Fehlerinformationen eingefügt werden. |
@ErrorLogIDint = 0 OUTPUT |
dbo.uspPrintError |
Druckt Fehlerinformationen zu dem Fehler, der dazu geführt hat, dass die Ausführung zum CATCH-Block eines TRY...CATCH-Konstrukts gesprungen ist. Diese Prozedur sollte aus dem Bereich eines CATCH-Blocks heraus ausgeführt werden, da andernfalls keine Fehlerinformationen gedruckt werden. |
Keine |
dbo.uspGetWhereUsedProductID |
Verwendet eine rekursive Abfrage (allgemeiner Tabellenausdruck), um alle Produktassemblys zurückzugeben, in dem das bestimmte Produktbauteil verwendet wird. So werden beispielsweise alle Fahrräder zurückgegeben, für die ein bestimmtes Rad oder ein bestimmter Lacktyp verwendet wurde. |
@StartProductIDint @CheckDatedatetime |
uspUpdateEmployeeHireInfo |
Aktualisiert die Employee-Tabelle und fügt eine neue Zeile in die EmployeePayHistory-Tabelle mithilfe der in den Eingabeparametern angegebenen Werten ein. |
@EmployeeIDint @Titlenvarchar(50) @HireDatedatetime @RateChangeDatedatetime @Ratemoney @PayFrequencytinyint @CurrentFlagdbo.Flag |
uspUpdateEmployeeLogin |
Aktualisiert die Employee-Tabelle anhand der in den Eingabeparametern angegebenen Werte für die angegebene EmployeeID-Spalte. |
@EmployeeID int @ManagerIDint @LoginIDnvarchar(256) @Titlenvarchar(50) @HireDatedatetime @CurrentFlagdbo.Flag |
uspUpdateEmployeePersonalInfo |
Aktualisiert die Employee-Tabelle anhand der in den Eingabeparametern angegebenen Werte für die angegebene EmployeeID-Spalte. |
@EmployeeID int @NationalIDNumbernvarchar(15) @BirthDatedatetime @MaritalStatusnchar(1) @Gendernchar(1) |
Beispiele
A. Verwenden von dbo.uspGetBillOfMaterials
Im folgenden Beispiel wird die gespeicherte Prozedur uspgetBillOfMaterials ausgeführt. Die Prozedur gibt eine hierarchische Liste der Bauteile zurück, die zur Fertigung des Produkts Road-550-W Yellow, 44 (ProductID800) verwendet werden.
USE AdventureWorks;
GO
DECLARE @CheckDate DATETIME;
SET @CheckDate = GETDATE();
EXEC [AdventureWorks].[dbo].[uspGetBillOfMaterials] 800, @CheckDate;
B. Verwenden von dbo.uspGetEmployeeManagers
Im folgenden Beispiel wird die gespeicherte Prozedur uspGetEmployeeManagers ausgeführt. Die Prozedur gibt eine hierarchische Liste der direkten und indirekten Vorgesetzten von EmployeeID 50 zurück.
USE AdventureWorks;
GO
EXEC dbo.uspGetEmployeeManagers 50;
C. Verwenden von dbo.uspGetManagerEmployees
Im folgenden Beispiel wird die gespeicherte Prozedur uspGetManagerEmployees ausgeführt. Die Prozedur gibt eine hierarchische Liste der direkten und indirekten Mitarbeiter zurück, die ManagerID 140 unterstellt sind.
USE AdventureWorks;
GO
EXEC dbo.uspGetManagerEmployees 140;
D. Verwenden von dbo.uspGetWhereUsedProductID
Im folgenden Beispiel wird die gespeicherte Prozedur usp_getWhereUsedProductID ausgeführt. Die Prozedur gibt alle Produkte zurück, in denen das Produkt ML Road Front Wheel (ProductID 819) verwendet wird.
USE AdventureWorks
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
E. Verwenden von HumanResources.uspUpdateEmployeeHireInfo
Im folgenden Beispiel wird die gespeicherte Prozedur uspUpdateEmployeeHireInfo ausgeführt. Die Prozedur aktualisiert die Spalten Title, HireDate und Current Flag in der Employee-Tabelle für die angegebene EmployeeID-Spalte und fügt der EmployeePayHistory-Tabelle eine neue Zeile mit Werten für EmployeeID, RateChangeDate, Rate und PayFrequency hinzu. Es müssen alle Parameterwerte angegeben werden.
USE AdventureWorks;
GO
EXEC [HumanResources].[uspUpdateEmployeeHireInfo]
@EmployeeID = 109,
@Title = N'President',
@HireDate = '19980513',
@RateChangeDate = '20041208',
@Rate = 50.00,
@PayFrequency = 1,
@CurrentFlag = 1;
F. Verwenden von HumanResources.uspUpdateEmployeeLogin
Im folgenden Beispiel wird die gespeicherte Prozedur uspUpdateEmployeeLogin ausgeführt. Die Prozedur aktualisiert die Spalten ManagerID, LoginID, Title, HireDate und Current Flag in der Employee-Tabelle für die EmployeeID 6-Spalte. Es müssen alle Parameterwerte angegeben werden.
USE AdventureWorks;
GO
DECLARE @HireDate datetime;
SET @HireDate = CONVERT(DATETIME,'19990619',101);
EXEC HumanResources.uspUpdateEmployeeLogin
@EmployeeID = 6,
@ManagerID = 273,
@LoginID = N'adventure-works\david01',
@Title = N'Marketing Vice President',
@HireDate = @HireDate,
@CurrentFlag = 1 ;
G. Verwenden von HumanResources.uspUpdateEmployeePersonalInfo
Im folgenden Beispiel wird die gespeicherte Prozedur uspUpdateEmployeePersonalInfo ausgeführt. Die Prozedur aktualisiert die Spalten NationalIDNumber, BirthDate, MaritalStatue und Gender in der Employee-Tabelle für EmployeeID 6. Es müssen alle Parameterwerte angegeben werden.
USE AdventureWorks;
GO
EXEC HumanResources.uspUpdateEmployeePersonalInfo
@EmployeeID = 6,
@NationalIDNumber = N'123-45-6789',
@BirthDate = '19651030',
@MaritalStatus = N'S',
@Gender = N'M';
GO
H. Verwenden von dbo.uspLogError
Im folgenden Beispiel wird versucht, das Produkt Mountain-400-W Silver, 38 (ProductID 980) aus der Production.Product-Tabelle zu löschen. Eine für die Tabelle geltende FOREIGN KEY-Einschränkung lässt den Löschvorgang nicht zu. Der aufgrund der Einschränkungsverletzung aufgetretene Fehler übergibt die Kontrolle an den CATCH-Block. Mithilfe des Codes im CATCH-Block wird zuerst überprüft, ob aktive Transaktionen vorliegen, dann wird ein Rollback der Transaktionen ausgeführt und anschließend die gespeicherte Prozedur uspLogError ausgeführt. Diese Prozedur gibt die Fehlerinformationen in die ErrorLog-Tabelle ein und gibt ErrorLogID der in den @ErrorLogID OUTPUT-Parameter eingefügten Zeile zurück. Der Standardwert des Parameters @ErrorLogID ist 0. Anschließend wird die Tabelle ErrorLog abgefragt, um die Ergebnisse der gespeicherten Prozedur anzuzeigen.
USE AdventureWorks;
GO
BEGIN TRY
BEGIN TRANSACTION;
DELETE FROM Production.Product
WHERE ProductID = 980;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
DECLARE @ErrorLogID INT;
EXECUTE dbo.uspLogError @ErrorLogID = @ErrorLogID OUTPUT;
END CATCH;
GO
--View the results of the uspLogError stored procedure
SELECT * FROM dbo.ErrorLog;
I. Verwenden von dbo.uspPrintError
Im folgenden Beispiel wird versucht, das Produkt Mountain-400-W Silver, 38 (ProductID980) aus der Production.Product-Tabelle zu löschen. Eine für die Tabelle geltende FOREIGN KEY-Einschränkung lässt den Löschvorgang nicht zu. Der aufgrund der Einschränkungsverletzung aufgetretene Fehler übergibt die Kontrolle an den CATCH-Block. Mithilfe des Codes im CATCH-Block wird die gespeicherte Prozedur uspPrintError ausgeführt. Diese Prozedur druckt die Fehlerinformationen.
USE AdventureWorks;
GO
BEGIN TRY
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
EXECUTE dbo.uspPrintError;
END CATCH;
GO
Siehe auch