业务背景:当我们要对存储过程设置一些传入参数时,如果存在传入参数允许不传入,那么为了保证参数的完整性,必须对存储过程的形参设置默认值,那么当执行存储过程,传入实参不完整时,SQL会自动检查是否有对应缺省实参对应的形参默认值,如果有,则语法通过,按形参默认值运行存储过程(存储过程中使用这个默认值,如果需要使用的话)。如果传入实参完整,对应形参的默认值按实参值执行;
例如:销售单调用存储过程,零售用户和合作商家给的优惠可能不一致,前者永远都给0.99的折扣,而合作商家根据不同等级,可能给0.99也可能不给0.99,传入多少折扣就按多少折扣计算,那么零售用户调用存储过程则可以少传入一个实参(折扣),而存储过程本身形参对应设置一个默认值(折扣=0.99),保证语法通过,而合作商家传入完整实参(折扣),按真实传入计算。
说得再多不如自己动手试试,以事实说话,加深理解,以下示例转自网上;
Example1:
USE AdventureWorks2008R2;
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
Example 2:
IF OBJECT_ID('dbo.my_proc', 'P') IS NOT NULL
DROP PROCEDURE dbo.my_proc;
GO
CREATE PROCEDURE dbo.my_proc
@first int = NULL, -- NULL default value
@second int = 2, -- Default value of 2
@third int = 3 -- Default value of 3
AS
SET NOCOUNT ON;
SELECT @first, @second, @third;
GO
最后,总结一下,设置默认参数的逻辑就是:要么传入参数根本就不传入这个设置默认值的参数对应的实参(传入参数5个,1个默认的,值传入4个参数),要么传入实参按实参执行;