首页 新闻 搜索 专区 学院

存储过程,参数为空

0
[已解决问题] 解决于 2009-11-04 14:44

有一个表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啊.

 

问题补充: 非常感谢下面两位的回答. 我也想到了第二位朋友的办法,但是,我有的表中有40多个字段,不能每个字段都这样判断是不是为null吧.工作量也很大,有没有其他什么办法啊? 我用事件查看器看了下,确实,用数据集调用时,@c1和@c2传的值确实是null值,但是我的存储过程里已经设定了默认为0了,而且数据库表中字段的定义也默认为0 了,为何还是会出现这种情况啊,求助!. 同样感谢Y'冬眠℡的回答,我现在知道了如何解决这个问题,但还是存在刚才说的那种情况,字段比较多,还有没有更优化的方法,谢谢.
Pwd的主页 Pwd | 初学一级 | 园豆:158
提问于:2009-11-04 10:35
< >
分享
最佳答案
0

"我用事件查看器看了下,确实,用数据集调用时,@c1和@c2传的值确实是null值,但是我的存储过程里已经设定了默认为0了,而且数据库表中字段的定义也默认为0 了,为何还是会出现这种情况啊,求助!."

这个的解释是:无论你在存储过程中设默认值还是在表中设置默认值,存储过程执行时都优先采用你传进去的参数值。

可用的做法是:

insert into tmp (c1,c2) values (isnull(@c1,0) ,isnull(@c2,0))

前面也不用加判断了!完毕。


 

dege301 | 老鸟四级 |园豆:2825 | 2009-11-04 11:23
同上
masterfy | 园豆:105 (初学一级) | 2009-11-04 11:46
其他回答(2)
0

估计这样还为NULL,说明你是有传值的,而且这个值为NULL.要从根上解决还是检查一下你的程序吧。除此之外当然也有其他的解决办法,但是这个才是根本。

清海扬波 | 园豆:823 (小虾三级) | 2009-11-04 10:40
默认的就是你没有传值的时候就是0,那么只要你传了值,不管是不是NULL,0就已经没有作用了,还是会按照NULL插入的。
支持(0) 反对(0) 清海扬波 | 园豆:823 (小虾三级) | 2009-11-04 11:09
0

建议判断参数为空再 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)

Y'冬眠℡ | 园豆:246 (菜鸟二级) | 2009-11-04 10:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册