T-SQL中存储过程输出参数的默认值有何用?

时间:2021-07-19 09:51:50
/****** Object:  StoredProcedure [dbo].[test]    Script Date: 06/16/2009 14:16:26 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[test]
go
create proc test
(@In int=0,
@Out  int=0 output)
as
begin
 --set @Out=@In+1
 select @Out
end
go
declare @Test int
exec test @Out=@Test output
select @Test

该例子中输出参数@Out的默认值0似乎根本没有用,因为输出值始终是null。

13 个解决方案

#1


没用

#2


输出参数必须在存储过程中附值

#3


引用 2 楼 Haiwer 的回复:
输出参数必须在存储过程中赋值

海爷明鉴

#4


确实没用。

#5


declare @Test int 
exec test @Out=@Test output 
select @Test 
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。

#6


输出参数要在程序中赋值

#7


引用 5 楼 acupofnescafe 的回复:
declare @Test int 
exec test @Out=@Test output 
select @Test 
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。 
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。 
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。

很有道理 LZ可以试试下面的代码

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[test] 
go 
create proc test 
(@In int=0, 
@Out  int=0 output) 
as 
begin 
--set @Out=@In+1 
select @Out 
end 
go 
declare @Test int 
set @test=1
exec test @Out=@Test output 
select @Test 

#8


奇怪

#9


引用 5 楼 acupofnescafe 的回复:
declare @Test int 
exec test @Out=@Test output 
select @Test 
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。 
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。 
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。


红色部分并不是给@out赋值,而是将参数@Test,传入存储过程,该语句相当于
exec test 0,@Test output 

#10



IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[test]
go
create proc test
(@In int=0,
@Out  int=250 output)
as
begin
--set @Out=@In+1
select @Out
end
go
exec test
--declare @Test int
--exec test @Out=@Test output
--select @Test 
--结果不就是250

#11


楼上的很正确,但是为什么不能在输出参数中得到default的值呢?

#12


如果存储过程体中没有用select @Out输出@Out我们是不是无法的到@Out的default值了

#13


引用 12 楼 GRANDTREE 的回复:
如果存储过程体中没有用select @Out输出@Out我们是不是无法的到@Out的default值了
250是由于没有改变@out的值。
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[test]
go
create proc test
(@In int=0,
@Out  int=250 output)
as
begin
set @Out=@In+1
end
go
exec test

declare @Test int
exec test @Out=@Test output
select @Test
 
结果:1

#1


没用

#2


输出参数必须在存储过程中附值

#3


引用 2 楼 Haiwer 的回复:
输出参数必须在存储过程中赋值

海爷明鉴

#4


确实没用。

#5


declare @Test int 
exec test @Out=@Test output 
select @Test 
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。

#6


输出参数要在程序中赋值

#7


引用 5 楼 acupofnescafe 的回复:
declare @Test int 
exec test @Out=@Test output 
select @Test 
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。 
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。 
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。

很有道理 LZ可以试试下面的代码

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[test] 
go 
create proc test 
(@In int=0, 
@Out  int=0 output) 
as 
begin 
--set @Out=@In+1 
select @Out 
end 
go 
declare @Test int 
set @test=1
exec test @Out=@Test output 
select @Test 

#8


奇怪

#9


引用 5 楼 acupofnescafe 的回复:
declare @Test int 
exec test @Out=@Test output 
select @Test 
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。 
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。 
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。


红色部分并不是给@out赋值,而是将参数@Test,传入存储过程,该语句相当于
exec test 0,@Test output 

#10



IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[test]
go
create proc test
(@In int=0,
@Out  int=250 output)
as
begin
--set @Out=@In+1
select @Out
end
go
exec test
--declare @Test int
--exec test @Out=@Test output
--select @Test 
--结果不就是250

#11


楼上的很正确,但是为什么不能在输出参数中得到default的值呢?

#12


如果存储过程体中没有用select @Out输出@Out我们是不是无法的到@Out的default值了

#13


引用 12 楼 GRANDTREE 的回复:
如果存储过程体中没有用select @Out输出@Out我们是不是无法的到@Out的default值了
250是由于没有改变@out的值。
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[test]
go
create proc test
(@In int=0,
@Out  int=250 output)
as
begin
set @Out=@In+1
end
go
exec test

declare @Test int
exec test @Out=@Test output
select @Test
 
结果:1