有一个表tmp,其中c1,c2均可以为空,并设置默认为0了.
现有一个存储过程如下:
create PROCEDURE dbo.inserttmp
(
@c1 decimal(18,2)=0,
@c2 decimal(18,2)=0
)
as
insert into tmp (c1,c2) values (@c1,@c2)
若执行该存储过程,exec inserttmp时,没有提供@c1,@c2,执行完成后,c1,c2的值默认为0.
但在使用数据集调用该存储过程时,插入数据后,为何c1,c2的值为NULL啊.有没有办法使参数c1,c2默认为0啊.
"我用事件查看器看了下,确实,用数据集调用时,@c1和@c2传的值确实是null值,但是我的存储过程里已经设定了默认为0了,而且数据库表中字段的定义也默认为0 了,为何还是会出现这种情况啊,求助!."
这个的解释是:无论你在存储过程中设默认值还是在表中设置默认值,存储过程执行时都优先采用你传进去的参数值。
可用的做法是:
insert into tmp (c1,c2) values (isnull(@c1,0) ,isnull(@c2,0))
前面也不用加判断了!完毕。
估计这样还为NULL,说明你是有传值的,而且这个值为NULL.要从根上解决还是检查一下你的程序吧。除此之外当然也有其他的解决办法,但是这个才是根本。
建议判断参数为空再 set
create PROCEDURE dbo.inserttmp
(
@c1 decimal,
@c2 decimal
)
as
if @c1 is null
set @c1 = 0
end if
insert into tmp (c1,c2) values (@c1,@c2)