存储过程OUTPUT参数默认值未生效问题咨询
存储过程OUTPUT参数默认值的行为困惑
我写了一个简单的存储过程,但它的行为让我困惑。我希望在不给参数赋值时,存储过程返回默认值,于是创建了如下存储过程:
CREATE PROCEDURE [dbo].[Test] @TestVariable int = 0 OUTPUT AS BEGIN SELECT @TestVariable END
我以为这段代码会返回0,但实际返回的是NULL。这个默认值好像没起作用,它到底有什么意义?
我找到的唯一解决办法是修改成这样:
CREATE PROCEDURE [dbo].[Test] @TestVariable int = 0 OUTPUT AS BEGIN IF @TestVariable IS NULL SET @TestVariable = 0 SELECT @TestVariable END
如果这是唯一办法也可以,但参数定义里的默认值到底有什么用?比如我创建了下面这个存储过程:
CREATE PROCEDURE [dbo].[Test2] @number1 int = 5, @number2 int = 5 AS BEGIN SELECT @number1 + @number2 END
当不传入任何参数时,默认值会生效,返回结果是10。但如果把@number1和@number2改成OUTPUT参数,结果又会默认返回NULL。我希望有人能解释这个让人困惑的行为。
我试过普通的非输出参数,它们的默认值能正常工作。另外我知道不需要用SELECT来输出变量,调用存储过程时它会自动返回,这么做只是为了测试。
执行语句如下:
DECLARE @Test int EXEC [dbo].[Test] @TestVariable = @Test OUTPUT SELECT @Test
解答
当把OUTPUT参数映射到变量时,这个变量会同时被当作输入参数使用,我之前没意识到这种双重行为。只有当不把OUTPUT参数映射到变量,且在存储过程内部使用它时,默认值才会生效。
内容的提问来源于stack exchange,提问作者Teun Kruijer
相关产品推荐
相关产品推荐

