通過指定過程參數,調用程序可以將值傳遞給過程的主體。
如果將參數標記為 OUTPUT 參數,則過程參數還可以將值返回給調用程序。
一個過程最多可以有 2100 個參數,每個參數都有名稱、數據類型和方向。 還可以為參數指定默認值(可選)。
將值傳遞給參數
使用過程調用提供的參數值必須為常量或變量,不能將函數名稱作為參數值。 變量可以是用戶定義的變量或系統變量(如 @@spid)。
下列示例演示如何將參數值傳遞給過程 uspGetWhereUsedProductID
。 它們說明了如何將參數作為常量和變量進行傳遞,以及如何使用變量傳遞函數值。
USE AdventureWorks2012; GO -- Passing values as constants. 傳遞常量 EXEC dbo.uspGetWhereUsedProductID 819, '20050225'; GO -- Passing values as variables. 傳遞變量 DECLARE @ProductID int, @CheckDate datetime; SET @ProductID = 819; SET @CheckDate = '20050225'; EXEC dbo.uspGetWhereUsedProductID @ProductID, @CheckDate; GO -- Try to use a function as a parameter value. -- This produces an error message. 傳遞函數,報錯 EXEC dbo.uspGetWhereUsedProductID 819, GETDATE(); GO -- Passing the function value as a variable. DECLARE @CheckDate datetime; SET @CheckDate = GETDATE(); EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate; GO
在存儲過程中定義參數
1.需要指定參數名稱
2.指定參數數據類型
3.可以指定參數默認值
4.可以指定參數方式(默認為輸入參數)
示例1:
USE AdventureWorks2012; GO IF OBJECT_ID('Sales.uspGetSalesYTD', 'P') IS NOT NULL DROP PROCEDURE Sales.uspGetSalesYTD; GO CREATE PROCEDURE Sales.uspGetSalesYTD @SalesPerson nvarchar(50) = NULL -- NULL default value AS SET NOCOUNT ON; -- Validate the @SalesPerson parameter. IF @SalesPerson IS NULL BEGIN PRINT 'ERROR: You must specify the last name of the sales person.' RETURN END -- Get the sales for the specified sales person and -- assign it to the output parameter. SELECT SalesYTD FROM Sales.SalesPerson AS sp JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID WHERE LastName = @SalesPerson; RETURN GO
運行如下
-- Run the procedure without specifying an input value. EXEC Sales.uspGetSalesYTD; GO -- Run the procedure with an input value. EXEC Sales.uspGetSalesYTD N'Blythe'; GO
示例2:
USE AdventureWorks2012; GO IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL DROP PROCEDURE Production.uspGetList; GO CREATE PROCEDURE Production.uspGetList @Product varchar(40) , @MaxPrice money , @ComparePrice money OUTPUT , @ListPrice money OUT AS SET NOCOUNT ON; SELECT p.[Name] AS Product, p.ListPrice AS 'List Price' FROM Production.Product AS p JOIN Production.ProductSubcategory AS s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice; -- Populate the output variable @ListPprice. SET @ListPrice = (SELECT MAX(p.ListPrice) FROM Production.Product AS p JOIN Production.ProductSubcategory AS s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice); -- Populate the output variable @compareprice. SET @ComparePrice = @MaxPrice; GO
運行如下腳本
DECLARE @ComparePrice money, @Cost money ; EXECUTE Production.uspGetList '%Bikes%', 700, @ComparePrice OUT, @Cost OUTPUT print 'Cost'+RTRIM(CAST(@Cost AS varchar(20))) print 'ComparePrice'+RTRIM(CAST(@ComparePrice AS varchar(20))) IF @Cost <= @ComparePrice BEGIN PRINT 'These products can be purchased for less than $'+RTRIM(CAST(@ComparePrice AS varchar(20)))+'.' END ELSE PRINT 'The prices for all products in this category exceed $'+ RTRIM(CAST(@ComparePrice AS varchar(20)))+'.';
效果