我目前正在调查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(假),但似乎不是这样。
顺便说一下 - 我正在考虑使用代码来避免输出参数的使用,以便进行比较。相反,我倾向于认为在存储过程结束之前使用内部变量并将其值分配给输出参数会更清楚。
任何回复/评论将不胜感激。
提前致谢。
答案 0 :(得分:2)
documentation在这一点上非常明确:
变量在批处理或过程的主体中声明 DECLARE语句并使用SET或者分配值 SELECT语句。可以使用此语句声明游标变量 并与其他与游标相关的语句一起使用。声明后,全部 变量初始化为NULL,除非作为一部分提供了值 声明。
表中的列也是如此。它适用于比特以及其他类型。
请注意,NULL
值未能通过所有比较(is null
除外),因此它不等于0
或1
。
答案 1 :(得分:1)
除非您指定默认值,否则SQL不会默认参数。如果未指定默认值,则参数值为NULL。
例如,下面所有PRINT语句的输出是&#34; @bitX为空&#34;:
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