日期:2014-05-18  浏览次数:20879 次

SQL的存储过程的使用
初涉SQL的存储过程,感觉用起来有点不安,在这边想多请教各位高手

下面是我定义的一个存储过程,通过用户编号的参数@PersonCode 来更新该用户的积分
CREATE PROCEDURE X3_updatePoint 
  @PersonCode varchar(40)  
AS 
select 
sPersonCode,
sum(case bState when 1 then lPoint when 0 then -lPoint else 0 end) as totalPoint,
sum(case bState when 1 then lPoint else 0 end) as addPoints,
sum(case bState when 0 then lPoint else 0 end) as DecPoint 
into #dd from X3_points where sPersonCode = @PersonCode group by sPersonCode
update X3_PointStat set 
lTotalPoint=a.totalPoint,
lAddPoint=a.addPoints,
lDecPoint = a.DecPoint 
from #dd a inner join X3_PointStat b on a.sPersoncode = b.sPersonCode where b.sPersonCode = @PersonCode
drop table #dd
GO

在.NET中调用存存储过程本来有个专门的方法,就是通过cmd.CommandText=storedProcName;声明存储过程。。。
但我觉得那样很麻烦,于是呼我就直接执行如下SQL语句也是可以实现效果的:
EXECUTE X3_updatePoint '34567'

1、现在就是不知道这样调用存储过程好不好,用什么方式调用存储过程效率会比较快呢?

2、还有一点,就是看到别人的存储过程里常有下面这个东东,用来干嘛的?我那种定义存储过程的方法不会有问题吧?
--关闭计数器
SET NOCOUNT ON
--打开计数器
SET NOCOUNT OFF

初次用这个存储过程,很多安全效率方面还不懂,
谨待赐教!



------解决方案--------------------
1.用cmd.CommandText=storedProcName;
2.如果SET NOCOUNT ON 
那么ExecuteNonQuery没有返回值,而如果没有,则执行成功,会返回影响人纪录数..
------解决方案--------------------
1.我没见人这样用过,但是我想当然是可以实现效果的 但是貌似有些怪异
2. 如果SET NOCOUNT ON 那么ExecuteNonQuery没有返回值,
而如果没有,则执行成功,会返回影响的记录数..
------解决方案--------------------
对于问题1 我很佩服搂主的想象力...
------解决方案--------------------
貌似1是ASP的执行方式.

问题2是设置是否返回受影响行数的.
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
当 SET NOCOUNT 为 OFF 时,返回计数。
------解决方案--------------------
sqlhelper
建议使用
开源的
微软官方开发的
很出名的