SQL Server联机丛书:存储过程及其创建[3]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 applebbs 的 blog

说明  使用 encryption 选项创建的存储过程不能使用 sp_helptext 查看。

若要显示有关过程引用的对象的报表,请使用 sp_depends

若要为过程重命名,请使用 sp_rename

引用对象

sql server 允许创建的存储过程引用尚不存在的对象。在创建时,只进行语法检查。执行时,如果高速缓存中尚无有效的计划,则编译存储过程以生成执行计划。只有在编译过程中才解析存储过程中引用的所有对象。因此,如果语法正确的存储过程引用了不存在的对象,则仍可以成功创建,但在运行时将失败,因为所引用的对象不存在。有关更多信息,请参见延迟名称解析和编译

延迟名称解析和兼容级别

sql server 允许 transact-sql 存储过程在创建时引用不存在的表。这种能力称为延迟名称解析。不过,如果 transact-sql 存储过程引用了该存储过程中定义的表,而兼容级别设置(通过执行 sp_dbcmptlevel 来设置)为 65,则在创建时会发出警告信息。而如果在运行时所引用的表不存在,将返回错误信息。有关更多信息,请参见 sp_dbcmptlevel延迟名称解析和编译

执行存储过程

成功执行 create procedure 语句后,过程名称将存储在 sysobjects 系统表中,而 create procedure 语句的文本将存储在 syscomments 中。第一次执行时,将编译该过程以确定检索数据的最佳访问计划。

使用 cursor 数据类型的参数

存储过程只能将 cursor 数据类型用于 output 参数。如果为某个参数指定了 cursor 数据类型,也必须指定 varying 和 output 参数。如果为某个参数指定了 varying 关键字,则数据类型必须是 cursor,并且必须指定 output 关键字。

说明  cursor 数据类型不能通过数据库 api(例如 ole db、odbc、ado 和 db-library)绑定到应用程序变量上。因为必须先绑定 output 参数,应用程序才可以执行存储过程,所以带有 cursor output 参数的存储过程不能通过数据库 api 调用。只有将 cursor output 变量赋值给 transact-sql 局部 cursor 变量时,才可以通过 transact-sql 批处理、存储过程或触发器调用这些过程。

cursor 输出参数

在执行过程时,以下规则适用于 cursor 输出参数:

  1. 对于只进游标,游标的结果集中返回的行只是那些存储过程执行结束时处于或超出游标位置的行,例如:
    1. 在过程中的名为 rs 的 100 行结果集上打开一个非滚动游标。

    2. 过程提取结果集 rs 的头 5 行。

    3. 过程返回到其调用者。

    4. 返回到调用者的结果集 rs 由 rs 的第 6 到 100 行组成,调用者中的游标处于 rs 的第一行之前。
  2. 对于只进游标,如果存储过程完成后,游标位于第一行的前面,则整个结果集将返回给调用批处理、存储过程或触发器。返回时,游标将位于第一行的前面。

  3. 对于只进游标,如果存储过程完成后,游标的位置超出最后一行的结尾,则为调用批处理、存储过程或触发器返回空结果集。

    说明  空结果集与空值不同。

  4. 对于可滚动游标,在存储过程执行结束时,结果集中的所有行均会返回给调用批处理、存储过程或触发器。返回时,游标保留在过程中最后一次执行提取时的位置。

  5. 对于任意类型的游标,如果游标关闭,则将空值传递回调用批处理、存储过程或触发器。如果将游标指派给一个参数,但该游标从未打开过,也会出现这种情况。

说明  关闭状态只有在返回时才有影响。例如,可以在过程中关闭游标,稍后再打开游标,然后将该游标的结果集返回给调用批处理、存储过程或触发器。

临时存储过程

sql server 支持两种临时过程:局部临时过程和全局临时过程。局部临时过程只能由创建该过程的连接使用。全局临时过程则可由所有连接使用。局部临时过程在当前会话结束时自动除去。全局临时过程在使用该过程的最后一个会话结束时除去。通常是在创建该过程的会话结束时。

临时过程用 # 和 ## 命名,可以由任何用户创建。创建过程后,局部过程的所有者是唯一可以使用该过程的用户。执行局部临时过程的权限不能授予其他用户。如果创建了全局临时过程,则所有用户均可以访问该过程,权限不能显式废除。只有在 tempdb 数据库中具有显式 create procedure 权限的用户,才可以在该数据库中显式创建临时过程(不使用编号符命名)。可以授予或废除这些过程中的权限。

说明  频繁使用临时存储过程会在 tempdb 中的系统表上产生争用,从而对性能产生负面影响。建议使用 sp_executesql 代替。sp_executesql 不在系统表中存储数据,因此可以避免这一问题。

自动执行存储过程

sql server 启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员创建,并在 sysadmin 固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。

对启动过程的数目没有限制,但是要注意,每个启动过程在执行时都会占用一个连接。如果必须在启动时执行多个过程,但不需要并行执行,则可以指定一个过程作为启动过程,让该过程调用其它过程。这样就只占用一个连接。

在启动时恢复了最后一个数据库后,即开始执行存储过程。若要跳过这些存储过程的执行,请将启动参数指定为跟踪标记 4022。如果以最低配置启动 sql server(使用 -f 标记),则启动存储过程也不会执行。有关更多信息,请参见跟踪标记

若要创建启动存储过程,必须作为 sysadmin 固定服务器角色的成员登录,并在 master 数据库中创建存储过程。

使用 sp_procoption 可以:

  1. 将现有存储过程指定为启动过程。

  2. 停止在 sql server 启动时执行过程。

  3. 查看 sql server 启动时执行的所有过程的列表。
存储过程嵌套

存储过程可以嵌套,即一个存储过程可以调用另一个存储过程。在被调用过程开始执行时,嵌套级将增加,在被调用过程执行结束后,嵌套级将减少。如果超出最大的嵌套级,会使整个调用过程链失败。可用 @@nestlevel 函数返回当前的嵌套级。

若要估计编译后的存储过程大小,请使用下列性能监视计数器。

性能监视器对象名 性能监视计数器名称
sqlserver:缓冲区管理器 高速缓存大小(页面数)
sqlserver:高速缓存管理器 高速缓存命中率
  高速缓存页
  高速缓存对象计数*

本文关键:SQL Server联机丛书:存储过程及其创建
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top