设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 6856|回复: 7
打印 上一主题 下一主题

存储过程与函数的区别(摘录)

[复制链接]
跳转到指定楼层
1#
发表于 2010-9-26 08:57:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

存储过程
存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。

存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。

可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:

可以在单个存储过程中执行一系列 SQL 语句。


可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。


存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。
用户定义函数
函数是由一个或多个 Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。Microsoft? SQL Server? 2000 并不将用户限制在定义为 Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。

可使用 CREATE FUNCTION 语句创建、使用 ALTER FUNCTION 语句修改、以及使用 DROP FUNCTION 语句除去用户定义函数。每个完全合法的用户定义函数名 (database_name.owner_name.function_name) 必须唯一。

必须被授予 CREATE FUNCTION 权限才能创建、修改或除去用户定义函数。不是所有者的用户在 Transact-SQL 语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。若要创建或更改在 CHECK 约束、DEFAULT 子句或计算列定义中引用用户定义函数的表,还必须具有函数的 REFERENCES 权限。

在函数中,区别处理导致删除语句并且继续在诸如触发器或存储过程等模式中的下一语句的 Transact-SQL 错误。在函数中,上述错误会导致停止执行函数。接下来该操作导致停止唤醒调用该函数的语句。

用户定义函数的类型
SQL Server 2000 支持三种用户定义函数:

标量函数


内嵌表值函数


多语句表值函数
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2010-9-26 15:33:48 | 只看该作者
存储过程还有一个好外就是它是在服务器上运行的, 对前台的资源要求少
3#
发表于 2010-9-26 16:51:02 | 只看该作者
很想学,但没看懂。是否可以用Access写一两个小的示例供学习?
4#
发表于 2010-9-26 21:28:49 | 只看该作者
回复 todaynew 的帖子

其实和VBA的模块的功能类似,只不它是运行在服务器的而且代码只能是SQL语句,由于它是运行在服务器端的,客户端就不需耗用太多的系统资源,只需发出执行命令即可,如下面的存储过程:
Create Procedure "DelStudent"
(@Sid int)
AS
      --删除学习成绩
      Delete FROM 学习成绩 WHERE StudentID=@Sid
  --删除值日记录
   Delete FROM 值日记录 WHERE StudentID=@Sid
     --删除学生资料
   Delete FROM Students WHERE Sid=@Sid
Return

上面这个存储过程用来删除一个学生资料以及他的学生成绩记录和值日记录;其实这些代码也是可以写在VBA中的,但存储过程是经过SQL优化编译的,执行效率比较高,而且网络通信量相对也比较少,比如上面这个存储过程要是写在VBA中,那么它必须将这些代码的字符全部通过网络传向服务器上执行,而用存储过程,执行时只需下面一行就够了:
currentproject.connection.execute("EXEC  DelStudent  @Sid="& me.Sid)
也就是说真正传用服务器的只有("EXEC  DelStudent  @Sid=n"这么些内容了,所以对网络的占用就相当的少了

以上为个人愚见,不对之处,还请诸位多多包涵
   
5#
发表于 2010-9-27 15:43:51 | 只看该作者
有一点点明白了。好像是在服务器上用SQL写存储过程,然后用VBA或者其他什么程序来调用或者执行这个存储过程。
看来还需要学习更多的SQL方面的知识才能真正理解和运用,对吧?
6#
发表于 2010-9-27 20:40:34 | 只看该作者
本帖最后由 zyp 于 2010-9-27 20:50 编辑

是的
虽然存储过程是保存在SQL server中的,但通过ADP可直接连接到SQL Server,也就是说可以在ADP中直接操作SQL Server的表\视图\存储过程,
存储过程很强大,但有时也不够灵活,所以我一般将存储过程和VBA代码结合起来,这样就可以最大发挥各自的长处.

不过对ADP的应用也不是很久,所以很多问题还在摸索当中

ADP相对MDB来讲,确实存在很多优势,比如:
(1)可以设定"入库日期"为当前的系统日期且不可更改,如果在MDB中,用户只要修改一下本机的日期就可以跳过这个限制了,但在ADP中,可将"入库日期"设为服务器的日期,本地日期再怎么改都没用,除非这个用有权限可以去更改服务器的日期,否则只能乖乖地用系统默认的服务器日期
(2)用户虽然可以通过连接功能的导入来导出ADP中的数据,但相对MDB而言, 对于导出的ADP数据的任何更改都不会影响到SQL Server中的数据,而MDB中如果是采用链接表的话,导出了即可对源表做任何的更改;
(3)在多用户情况下,运行速度比MDB要快
(4)不论数据表有没有用户在使用,可以随时对表的结构进行更改,而MDB的表一旦使用中,就不能做更改;
7#
发表于 2010-9-27 22:20:39 | 只看该作者
SQL server中SQL最爽的是支持条件语句、支持标量函数。
8#
发表于 2010-10-23 12:19:29 | 只看该作者
知识越学越不够用!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 04:37 , Processed in 0.096588 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表