设为首页
加入收藏
帮助中心
首页 | 红盾通告 | 信息中心 | ASP技术 | 数据库 | 网页设计 | 网管专栏 | OICQ攻略 | 墨客频道 | 网站运营 |
当前位置:首页 >> 数据库 >> SQL Server >> 正文
最新信息
·SQL2000做附加数据库时报:…
·数据库sql被挂马终极批量删…
·动网论坛全文索引建立帮助
·论坛不支持文章内容搜索的…
·打造抵御SQL注入攻击的MSS…
·10个保护SQL Server 2000安…
·sql server安全设置攻略
·SQL Server安全设置清单列…
·使用 SQL Server 时需要经…
·SQL中触发器实例讲解
资料搜索
热点信息
·如何压缩SQL Server 2000数…
·SQL中触发器实例讲解
·日志文件满而造成SQL数据库…
·10个保护SQL Server 2000安…
·使用 SQL Server 时需要经…
·SQL2000做附加数据库时报:…
·SQL SERVER的安全隐患:触…
·asp如何连接sql server并实…
·SQL Server不能启动的常见…
·一种简单的表中删除重复行…
推荐信息
·打造抵御SQL注入攻击的MSS…
·SQL Server数据库开发的二…
·Sqlserver 优化的方法
·SQLServer吞噬的内存解决办…
·SQL SERVER日志清除的两种…
·如何压缩SQL Server 2000数…
·SQL Server 2000 SP4发布
·动网论坛全文索引建立帮助
·10个保护SQL Server 2000安…
·SQL Server安全设置清单列…


Google
 
SQL Server存储过程编程经验技巧
〖来源:不详 | 作者:霍林涛 | 编辑:Cloudy | 浏览:人次〗

MS SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着
MS SQL Server2000的推出,微软的这种数据库服务系统真正的实现了在WindowsNT/200
0系列操作系统一统天下的局面,在微软的操作系统上面,没有任何一种数据库系统能与之相抗衡,包括数据库领域的领
头羊甲骨文公司的看家数据库系统Oracle在内。不可否认,MS SQL Server最大的缺陷就是只能运行
在微软自己的操作系统上面,这一点是MS SQL Server的致命伤口。但在另一方面却也成了最好的促进剂,
促使MS SQL Server在自己仅有的“土地”上面将自己的功能发挥到了极至,最大限度的利用了Windo
wsNT系列操作系统的各种潜能!作为MS SQL Server数据库系统中很重要的一个概念就是存储过程,合
理的使用存储过程,可以有效的提高程序的性能;并且将商业逻辑封装在数据库系统中的存储过程中,可以大大提高整个
软件系统的可维护性,当你的商业逻辑发生了改变的时候,不再需要修改并编译客户端应用程序以及重新分发他们到为数
众多的用户手中,你只需要修改位于服务器端的实现相应商业逻辑的存储过程即可。合理的编写自己需要的存储过程,可
以最大限度的利用MS SQL Server的各种资源。下面我们来共同看看各种编写MS SQL Server
存储过程和使用存储过程的技巧经验!

  下面我们讨论的前提都是您有过一定的MS SQL Server存储过程的编写经验,下面的各种技巧如果没有
特别注明,则同时适用于MS SQL Server7.0和MS SQL Server2000。

  1、使用OUTPUT类型参数的存储过程的技巧

一般的存储过程都是直接返回一段记录集给调用者,但是有的时候我们只需要一些存储过程返回的一些参数的值,这时候
可以指定存储过程的OUTPUT参数,比如:

  Create procedure GetName 

  @uid nvarchar(1),

  @usernam nvarchar(10)='' output

  AS

  set @username='hongchao'

  GO

  在上面的存储过程当中我们传递进的参数是@uid,而参数@username则在调有的时候不需要传递进去。
这样,存储过程会返回给我们参数@username的值是‘hongchao’。上面的都比较的容易,需要注意的
是,当在SQL2000中的时候,如果你的存储过程只有一个参数,并且这个参数是OUTPUT类型的,你必须在调
用这个存储过程的时候给这个参数一个初始的值,否则会出现调用错误的情况!

  2、在存储过程中的书写注意事项

  这一点在MS SQL Server7.0和MS SQL Server2000种有些地方是不一样的,也不
知道是不是微软的遗漏,那就是有些系统的关键字在不同的版本之间有所不同,比如关键字level,同样的一句话:

select * from users where level=1

在MS SQL Server7当中的存储过程当中运行没有丝毫的问题,但是到了MS SQL Server20
00当中则会出现运行的错误,原因就是在于在MS SQL Server2000中“level”被当作了关键字
(奇怪的是SQL7当中也同样是关键字,却没问题),所以在SQL2000当中,上面的语句应当改为:

select * from users where [level]=1

从上面的例子中我们可以看到,在你编写存储过程的时候,最好在有可能和系统关键字的地方使用“[”和“]”将他包
围起来,以避免在移植过程中出现的运行错误问题。

  3、在存储过程中使用系统存储过程SP_Executesql的注意事项

  我们在编写自己的存储过程的时候,往往在很多的情况下,会使用到系统的存储过程SP_Execute。但是需
要的注意的是,如果你在这个存储过程的参数(一般是一段SQL语句)当中进行了临时Table的操作,那末对于调
用者来说,这个临时Table是不可见的,也就是说你无法通过临时Table来在调用者和被调用者之间传递值。解
决的方法是使用全局临时Table,也就是“##”开头的Table。

  4、在存储过程中使用临时Table和游标的注意事项

  如果我们的商业逻辑比较复杂,在存储过程当中,就需要一些媒介作为中转台,这时候临时表舅发挥了作用,但是请
务必记得在使用完之后,即使删除使用到的临时Table。

  而在存储过程当中想要依次遍历一个记录集的唯一方法就是使用系统游标,同样要注意的是,在使用完成之后及时关
闭和销毁游标对象释放他用到的资源。并且不在万不得已的情况下,不要随意使用游标,因为他会占用较多的系统资源,
尤其是对于大并发量的情况下,很容易使得系统资源耗尽而崩溃。

  使用临时Table和游标各有利弊,在使用的过程中要适当的利用即可!

  5、在存储过程中调用外部的ActiveX DLL程序

  有些特殊的情况下,我们可能会需要调用外部的ActiveX DLL程序,这个时候就需要使用到系统的存储过
程sp_OACreate以及其他的相关系统存储过程,都是以sp_OA开头的存储过程,可以自由的在自己的存储
过程当中调用ActiveX DLL的各种方法和属性。比如下面的例子:

  DECLARE @object int

  DECLARE @hr int

  DECLARE @property varchar(255)

  DECLARE @return varchar(255)

  DECLARE @src varchar(255), @desc varchar(255)

  -- 建立一个对象(SQLDMO.SQLServer).

  EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object 
OUT

  IF @hr <> 0

  BEGIN

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT 

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc

      RETURN

  END

  -- 设置对象的属性.

  EXEC @hr = sp_OASetProperty @object, 'HostName', 'G
izmo'

  IF @hr <> 0

  BEGIN

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT 

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc

      RETURN

  END

  -- 通过OUTPUT参数获取对象的属性值.

  EXEC @hr = sp_OAGetProperty @object, 'HostName', @p
roperty OUT

  IF @hr <> 0

  BEGIN

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT 

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc

      RETURN

  END

  PRINT @property

  -- 调用对象的方法

  EXEC @hr = sp_OAMethod @object, 'Connect', NULL, 'm
y_server', 'my_login', 'my_password'

  IF @hr <> 0

  BEGIN

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT 

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc

      RETURN

  END

  -- 销毁已经创建的ActiveX对象

  EXEC @hr = sp_OADestroy @object

  IF @hr <> 0

  BEGIN

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT 

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc

      RETURN

  END

  6、在存储过程中使用数据库事务处理

  在很多的情况下,我们在存储过程中都会遇到需要同时操作多个表的情况,这时候就需要避免在操作的过程中由于以
外而造成的数据的不一致性。这时候就需要将操作多个表的操作放入到事务中进行处理。

  但是需要注意的是,不能在事务中使用return语句强行退出,这样会引发事务的非正常错误,不能保证数据的一致
性。

  并且,一旦将多个处理放入事务当中,系统的处理速度会有所降低,所以应当将频繁操作的多个可分割的处理过程放
入到多个存储过程当中,这样会大大提高系统的响应速度,但是前提是不违背数据的一致性。

  看完了上面的这些编写SQL Server存储过程当中的技巧,相信对您或多或少会有些帮助,也希望通过上面的一些经验
总结,可以使得您在应用SQL Server存储过程的时候,有意识的可以避免一些弯路。

  (以上所有程序在Windows Advance Server2000中文版+MS SQL Server7.0/2000中文版测试通过)


录入时间:2006-05-06 10:44:28 [打印本页] [关闭窗口] [返回顶部]
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

Copyright © 2006-2014 0733168.Com Inc All Rights Reserved
关于我们 | 广告合作 | 联系我们 | 法律声明 | 友情链接 | 意见反馈
本站所收录信息、社区话题、及本站所做之广告均属其个人行为,与本站立场无关
湘ICP备06008436号