T-SQL-位输出参数默认值



我目前正在调查在MS SQL Server 2008上构建的存储过程中的一个错误。当前存储过程签名看起来像:

CREATE PROCEDURE dbo.<Name>
(
ParameterOne int
, ParameterTwo bit output
)

在代码中,正在评估输出参数值,以确定至少对我来说可疑的代码流

IF ( ParameterTwo = 0 )
BEGIN
PRINT ParameterTwo
-- Do stuffs
END
IF ( ParameterTwo = 0)
BEGIN
PRINT ParameterTwo
-- Do other stuffs
END

调试时(使用PRINT),我配置了要在块#1和块内部显示的标志#2.但在执行代码时,它们都没有显示出来。但是,如果在执行块#1之前为ParameterTwo指定一个值(ParameterTwo=0),则标志将按预期显示。

我关心的显然是位输出参数的创建。当您创建一个位参数(输入/输出)时,它是由MS SQL Server分配的默认值(如果有)?。这是NULL值吗?我当时的印象是0(错误),但事实并非如此。

顺便说一句,我正在考虑避免在代码中使用输出参数进行比较。相反,我倾向于认为使用内部变量并在存储过程结束之前将其值分配给输出参数会更清楚。

如有任何回复/意见,我们将不胜感激。

提前谢谢。

文档在这一点上非常清楚:

变量在批处理或过程的主体中声明DECLARE语句,并通过使用SET或SELECT语句。可以使用以下语句声明游标变量并与其他光标相关语句一起使用。声明后,所有变量初始化为NULL,除非提供valu作为部分声明。

表中的列也是如此。它适用于钻头以及其他类型的钻头。

请注意,NULL值未通过所有比较(is null除外),因此它不等于01

SQL不会默认参数,除非指定默认值。如果未指定默认值,则参数值为NULL。

例如,下面所有PRINT语句的输出都是"@bitX为null":

create procedure sp_testbit
(
@bit1 bit,
@bit2 bit output
)
as begin
if @bit1 is null print 'sp_testbit @bit1 is null'
else print 'sp_testbit @bit1 = ' + cast (@bit1 as varchar)
if @bit2 is null print 'sp_testbit @bit2 is null'
else print 'sp_testbit @bit2 = ' + cast (@bit2 as varchar)
end
go
declare @bit1 bit, @bit2 bit
exec sp_testbit @bit1, @bit2 output
if @bit1 is null print 'exec sp_testbit @bit1 is null'
else print 'exec sp_testbit @bit1 = ' + cast (@bit1 as varchar)
if @bit2 is null print 'exec sp_testbit @bit2 is null'
else print 'exec sp_testbit @bit2 = ' + cast (@bit2 as varchar)
go
drop procedure sp_testbit
go

您可以声明一个参数,同时为其指定一个默认值。这使得可以选择传递输入参数:

create procedure sp_testbit
(
@bit1 bit = 0,
@bit2 bit = 0 output
)

如果您不希望输入参数是可选的,您可以在存储过程代码中显式设置值:

create procedure sp_testbit
(
@bit1 bit,
@bit2 bit output
)
as begin
if @bit1 is null set @bit1 = 0 -- default the input bit
set @bit2 = 0                  -- default the output bit

最新更新