AdventureWorks 中的預存程序
AdventureWorks 範例 OLTP 資料庫包含數個 Transact-SQL 預存程序。您可以從 Microsoft SQL Server 範例和社群專案 (英文) 首頁下載 Common Language Runtime (CLR) 預存程序的範例。
CLR 預存程序
下表列出可用的 CLR 預存程序範例。如需有關 CLR 預存程序的詳細資訊,請參閱<CLR 預存程序>。
範例 |
說明 |
---|---|
AdventureWorks Cycles CLR 層 |
C# 架構的預存程序,可接受 xml 資料當做其輸入,並將資料插入到 Person.Contact 資料表的資料行中。 |
Transact-SQL 預存程序
下表列出包含於 AdventureWorks 範例 OLTP 資料庫內的 Transact-SQL 預存程序。如需有關 Transact-SQL 預存程序的詳細資訊,請參閱<了解預存程序>。
預存程序 |
說明 |
輸入參數 |
---|---|---|
dbo.uspGetBillOfMaterials |
使用遞迴查詢 (通用資料表運算式) 來產生多階層的「用料單」:階層 0 組件的所有階層 1 元件、階層 1 組件的所有階層 2 元件,依此類推。 |
@StartProductIDint @CheckDatedatetime |
dbo.uspGetEmployeeManagers |
使用遞迴查詢 (通用資料表運算式),傳回指定員工的直屬經理及非直屬經理。 |
@EmployeeIDint |
dbo.uspGetManagerEmployees |
使用遞迴查詢 (通用資料表運算式),傳回指定經理的直屬員工及非直屬員工。 |
@ManagerIDint |
dbo.uspLogError |
記錄 dbo.ErrorLog 資料表中的錯誤資訊,這些錯誤造成執行跳到 TRY...CATCH 建構函式的 CATCH 區塊。這個程序應該從 CATCH 區塊範圍內執行;否則,它返回時不會插入錯誤資訊。 |
@ErrorLogIDint = 0 OUTPUT |
dbo.uspPrintError |
列印錯誤資訊,這些錯誤造成執行跳到 TRY...CATCH 建構函式的 CATCH 區塊。這個程序應該從 CATCH 區塊範圍內執行;否則,它返回時不會列印任何錯誤資訊。 |
無 |
dbo.uspGetWhereUsedProductID |
使用遞迴查詢 (通用資料表運算式),傳回使用指定產品元件的所有產品組件。例如,傳回使用指定車輪或油漆類型的所有自行車。 |
@StartProductIDint @CheckDatedatetime |
uspUpdateEmployeeHireInfo |
使用輸入參數中指定的值,更新 Employee 資料表,並在 EmployeePayHistory 資料表中插入新資料列。 |
@EmployeeIDint @Titlenvarchar(50) @HireDatedatetime @RateChangeDatedatetime @Ratemoney @PayFrequencytinyint @CurrentFlagdbo.Flag |
uspUpdateEmployeeLogin |
以指定之 EmployeeID 的輸入參數中所指定的值更新 Employee 資料表。 |
@EmployeeIDint @ManagerIDint @LoginIDnvarchar(256) @Titlenvarchar(50) @HireDatedatetime @CurrentFlagdbo.Flag |
uspUpdateEmployeePersonalInfo |
以指定之 EmployeeID 的輸入參數中所指定的值更新 Employee 資料表。 |
@EmployeeIDint @NationalIDNumbernvarchar(15) @BirthDatedatetime @MaritalStatusnchar(1) @Gendernchar(1) |
範例
A. 使用 dbo.uspGetBillOfMaterials
下列範例會執行 uspgetBillOfMaterials 預存程序。程序會傳回用來製造產品 "Road-550-W Yellow, 44" (ProductID800) 之元件的階層式清單。
USE AdventureWorks;
GO
DECLARE @CheckDate DATETIME;
SET @CheckDate = GETDATE();
EXEC [AdventureWorks].[dbo].[uspGetBillOfMaterials] 800, @CheckDate;
B. 使用 dbo.uspGetEmployeeManagers
下列範例會執行 uspGetEmployeeManagers 預存程序。程序會傳回 EmployeeID 50 之直屬及非直屬經理的階層式清單。
USE AdventureWorks;
GO
EXEC dbo.uspGetEmployeeManagers 50;
C. 使用 dbo.uspGetManagerEmployees
下列範例會執行 uspGetManagerEmployees 預存程序。程序會傳回 ManagerID 140 之直屬及非直屬員工的階層式清單。
USE AdventureWorks;
GO
EXEC dbo.uspGetManagerEmployees 140;
D. 使用 dbo.uspGetWhereUsedProductID
下列範例會執行 usp_getWhereUsedProductID 預存程序。程序會傳回使用產品 "ML Road Front Wheel" (ML 道路型前輪) (ProductID 819) 的所有產品。
USE AdventureWorks
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
E. 使用 HumanResources.uspUpdateEmployeeHireInfo
下列範例會執行 uspUpdateEmployeeHireInfo 預存程序。程序會為指定的 EmployeeID 更新 Employee 資料表中的 Title、HireDate 和 Current Flag 資料行,並使用 EmployeeID、RateChangeDate、Rate 和 PayFrequency 的值在 EmployeePayHistory 資料表中插入新的資料列。所有參數值都必須指定。
USE AdventureWorks;
GO
EXEC [HumanResources].[uspUpdateEmployeeHireInfo]
@EmployeeID = 109,
@Title = N'President',
@HireDate = '19980513',
@RateChangeDate = '20041208',
@Rate = 50.00,
@PayFrequency = 1,
@CurrentFlag = 1;
F. 使用 HumanResources.uspUpdateEmployeeLogin
下列範例會執行 uspUpdateEmployeeLogin 預存程序。程序會為 EmployeeID 6 更新 Employee 中的 ManagerID, LoginID, Title、HireDate 和 Current Flag 資料行。所有參數值都必須指定。
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. 使用 HumanResources.uspUpdateEmployeePersonalInfo
下列範例會執行 uspUpdateEmployeePersonalInfo 預存程序。此程序會更新 EmployeeID 6 之 Employee 資料表的 NationalIDNumber、BirthDate、MaritalStatue 與 Gender 資料行。所有參數值都必須指定。
USE AdventureWorks;
GO
EXEC HumanResources.uspUpdateEmployeePersonalInfo
@EmployeeID = 6,
@NationalIDNumber = N'123-45-6789',
@BirthDate = '19651030',
@MaritalStatus = N'S',
@Gender = N'M';
GO
H. 使用 dbo.uspLogError
下列範例嘗試刪除 Production.Product 資料表上的 "Mountain-400-W Silver, 38" (ProductID 980) 產品。資料表上的 FOREIGN KEY 條件約束會造成刪除作業失敗,而條件約束違反錯誤就會將控制傳遞至 CATCH 區域。CATCH 區塊內的程式碼首先檢查任何使用中的交易再回復這些交易,然後才執行 uspLogError 預存程序。這個程序會在 ErrorLog 資料表中輸入錯誤資訊,然後傳回插入到 @ErrorLogID OUTPUT 參數的 ErrorLogID 資料列。@ErrorLogID 參數的預設值為 0。然後會查詢 ErrorLog 資料表,以檢視預存程序的結果。
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. 使用 dbo.uspPrintError
下列範例嘗試刪除 Production.Product 資料表上的 "Mountain-400-W Silver, 38" (ProductID980) 產品。資料表上的 FOREIGN KEY 條件約束會造成刪除作業失敗,而條件約束違反錯誤就會將控制傳遞至 CATCH 區域。CATCH 區塊內的程式碼會執行 uspPrintError 預存程序。此程序會列印錯誤資訊。
USE AdventureWorks;
GO
BEGIN TRY
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
EXECUTE dbo.uspPrintError;
END CATCH;
GO