我有一个带有输出参数的存储过程,我用“0”初始化:
ALTER PROCEDURE dbo.SomeProcedure
@someparam INT = 0 OUT
...
但是,当过程在执行期间没有修改或设置该参数时,输出值为 NULL,而不是预期的“0”。
是否必须在程序代码中设置默认值
SET @someparam = 0;
并避免在声明中初始化?
那么为什么 SQL Server 允许在声明输出参数时使用默认值呢?
我有一个带有输出参数的存储过程,我用“0”初始化:
ALTER PROCEDURE dbo.SomeProcedure
@someparam INT = 0 OUT
...
但是,当过程在执行期间没有修改或设置该参数时,输出值为 NULL,而不是预期的“0”。
是否必须在程序代码中设置默认值
SET @someparam = 0;
并避免在声明中初始化?
那么为什么 SQL Server 允许在声明输出参数时使用默认值呢?
您显示的语法不是用于初始化,而是用于缺少参数的默认值:
default
参数的默认值。如果为参数定义了默认值,则可以在不为该参数指定值的情况下执行过程。
因此,应该清楚的是,如果您可以读取输出值,则一定是您为 @someparam 提供了一个参数,因此它不是“缺失”的。如果不是“缺失”,则不会为其分配默认值,因为它必须已经有一个值,即来自调用者框架的值(可能为 NULL)。QED。
以下代码显示了差异并举例说明了您看到的行为:
create procedure usp_test
@p int = 0 output
as
set @p += 1;
select @p;
go
exec usp_test;
go
declare @unitialized int;
exec usp_test @unitialized output;
go