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
海爷明鉴
#4
确实没用。
#5
declare @Test int
exec test @Out=@Test output
select @Test
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。
exec test @Out=@Test output
select @Test
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。
#6
输出参数要在程序中赋值
#7
很有道理 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
红色部分并不是给@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
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
海爷明鉴
#4
确实没用。
#5
declare @Test int
exec test @Out=@Test output
select @Test
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。
exec test @Out=@Test output
select @Test
输出参数的默认值是在不给该参数提供值时,使用默认值。一旦有对输出参数赋值得语句,默认值就不再使用了。
红色部分已经将输出参数@Out的值赋予了与@Test相同的值。而@Test的值在使用之前,只是定义了,没有对他进行初始化。
所以它里面就没有具体值,所以输出也就是null了。在此之前给@Test初始化一个值,就会得到结果了。
#6
输出参数要在程序中赋值
#7
很有道理 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
红色部分并不是给@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
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