日期:2014-05-19  浏览次数:20489 次

存储过程和触发器的区别
看了社区里有相关的帖子,但是基本上都是概念间的比较.主要想问一下,有没有什么情况下必须只能使用存储过程而不能使用触发器(或者反之),又或者在2个都能使用的情况下,效率和占用资源有没有什么区别?请高手帮忙释疑下,谢谢了

------解决方案--------------------
下面是存储过程和用户自定义函数的

存储过程:
存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:
1、可以在单个存储过程中执行一系列 SQL 语句。
2、可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
3、存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。

用户定义函数:
Microsoft SQL Server 2000 允许创建用户定义函数。与任何函数一样,用户定义函数是可返回值的例程。根据所返回值的类型,每个用户定义函数可分成以下三个类别:
1、返回可更新数据表的函数
如果用户定义函数包含单个 SELECT 语句且该语句可更新,则该函数返回的表格格式结果也可以更新。
2、返回不可更新数据表的函数
如果用户定义函数包含不止一个 SELECT 语句,或包含一个不可更新的 SELECT 语句,则该函数返回的表格格式结果也不可更新。
3、返回标量值的函数
用户定义函数可以返回标量值。

视图:
视图只是保存在数据库中的 SELECT 查询。因此,可对查询执行的大多数操作也可在视图上执行。
------解决方案--------------------
存储过程要另外调用
触发器做增删改时自动执行。

和增删改无关的动作不可能用触发器实现吧
由 增删改 发起的动作, 用触发器可能更方便些

因为你可以使用 inserted 和 deleted 表
如果触发器和存储过程语句一样,在执行中没有区别,区别只是你的调用和系统自动调用。



------解决方案--------------------
通俗来讲,存储过程是要人干涉的,也就是说你如果不调用它,它就不会执行,而触发器,是不
需要人为干涉的,当达到什么条件下,它会自动执行。

有没有什么情况下必须只能使用存储过程而不能使用触发器
----------------
当然有,这要从它们的功能说起,如果你要写报表,存储过程最好了.如是当作约束时,只能用触发器了。
比如说,向一个表插入一条新数据,不能插入有相同记录,这时用触发器.

或者在2个都能使用的情况下,效率和占用资源有没有什么区别?

----------------
就我个人理解触发器效率和占用资源都要比存储过程要好,原因很简单,存储过程里放的是大量的sql语句
需要编译,执行时间也要比触发器要长.

LS的继续,请指正



------解决方案--------------------
有没有什么情况下必须只能使用存储过程而不能使用触发器(或者反之)
----------------------------

触发器也是存储过程,用哪个看你具体的需要了
触发器的效率个人理解更高些