昨天在循环调用一个存储过程时,发现每次返回的参数值都不变,感觉好像传入的参数被缓存了,可在查阅相关资料也没有找到对应的解决办法,最后在跟踪代码时发现原来是被调用的存储过程的一个传入参数未被初始化所致。
大概的描述可以通过如下的代码展现:
Code
-- 下面的代码执行时,定义一个参数,并初始化一个值,在通过select赋值时,如果条件不符没有取到值,则参数会维持原有的值
declare @productId int
set @productId=12
select @productId=productid from product where 1=2
select @productId
-- 下边的函数没有对传出的参数做初始化,那么@ProductId如果在调用前的值会被传入,这样在查询条件如果不满足时@productid会维持传入时的值
create proc TestInputPara
(
@inid int,
@productId int output
)
as
-- 下边的语句执行时,@productId会保持传入时的值
-- 如果在@product为null时,@productId会被改变为@inid+1的值,如果在循环调用中,@productid在传入前没有做初始化处理,则以后的每次调用将保持第一次所被赋予的值
select @productId=productid from product where 1=2
if (@productId is null)
set @productId=@inid+1
return
--
declare @myid int
declare @myproductid int
set @myid=1
while @myid<=3
begin
-- 此处要注意,@productid作为传出参数,始终没有在外部并没有做赋值处理
exec TestInputPara @inid=@myid,@productid=@myproductid output
print @productid
set @myid = @myid+1
end
-- 此程序的执行结果将为:
2
2
2
-- 如果修改修改上边的程序,或者修改存储过程
-- 修改代码
declare @myid int
declare @myproductid int
set @myid=1
while @myid<=3
begin
-- 注意下边的赋值处理
set @myproductid = null
exec TestInputPara @inid=@myid,@productid=@myproductid output
print @productid
set @myid = @myid+1
end
-- 修改存储过程
create proc TestInputPara
(
@inid int,
@productId int output
)
as
-- 注意下边的赋值处理
set @productId = null
select @productId=productid from product where 1=2
if (@productId is null)
set @productId=@inid+1
return
-- 再运行代码,执行结果将变为
2
3
4
-- 下面的代码执行时,定义一个参数,并初始化一个值,在通过select赋值时,如果条件不符没有取到值,则参数会维持原有的值
declare @productId int
set @productId=12
select @productId=productid from product where 1=2
select @productId
-- 下边的函数没有对传出的参数做初始化,那么@ProductId如果在调用前的值会被传入,这样在查询条件如果不满足时@productid会维持传入时的值
create proc TestInputPara
(
@inid int,
@productId int output
)
as
-- 下边的语句执行时,@productId会保持传入时的值
-- 如果在@product为null时,@productId会被改变为@inid+1的值,如果在循环调用中,@productid在传入前没有做初始化处理,则以后的每次调用将保持第一次所被赋予的值
select @productId=productid from product where 1=2
if (@productId is null)
set @productId=@inid+1
return
--
declare @myid int
declare @myproductid int
set @myid=1
while @myid<=3
begin
-- 此处要注意,@productid作为传出参数,始终没有在外部并没有做赋值处理
exec TestInputPara @inid=@myid,@productid=@myproductid output
print @productid
set @myid = @myid+1
end
-- 此程序的执行结果将为:
2
2
2
-- 如果修改修改上边的程序,或者修改存储过程
-- 修改代码
declare @myid int
declare @myproductid int
set @myid=1
while @myid<=3
begin
-- 注意下边的赋值处理
set @myproductid = null
exec TestInputPara @inid=@myid,@productid=@myproductid output
print @productid
set @myid = @myid+1
end
-- 修改存储过程
create proc TestInputPara
(
@inid int,
@productId int output
)
as
-- 注意下边的赋值处理
set @productId = null
select @productId=productid from product where 1=2
if (@productId is null)
set @productId=@inid+1
return
-- 再运行代码,执行结果将变为
2
3
4