快速业务通道

SQL Server自带的用户自定义函数

作者 佚名技术 来源 数据库编程 浏览 发布时间 2012-03-22
数据表更新、插入和删除等事务操作。因此执行这些操作后,数据库事务日志中会有相应的记录出现。  

【示例9】fn_get_sql函数的应用。

对于DBA(数据库管理员)来说,SQL Server 2005提供的另外一个强大的函数是fn_get_sql。通过该函数,数据库管理员和开发人员可以很轻松地获取正在被一个SQL进程执行的SQL文本。因此,如果需要诊断或调试出现的某种死锁或阻塞问题,使用该函数将显得非常有用。fn_get_sql的语法约定如下所示。

fn_get_sql ( SqlHandle )

其中SqlHandle为指定的SQL句柄。函数将返回指定SQL句柄的文本。SQL Server 2005的系统视图Sys.SysPRocesses中包含着当前Microsoft SQL Server实例中运行的所有进程信息。其中包含了cmd字段,即当前执行的命令,以及sqlhandle字段,即当前正在执行的批处理语句或对象的句柄。除此之外,SQL Server中还提供了一个名为sys.dm_exec_requests的动态管理视图。该视图中包含当前SQL Server的每一个请求的相关信息,其中包括字段sql_handle。通过访问这两个视图Sys.Sysprocesses和sys.dm_exec_requests,就可以获取与指定sql_handle相关的所有信息,具体设置过程如下。

(1) 在【查询编辑器】中输入以下SQL脚本代码:

SELECT *
FROM master.dbo.sysprocesses



(2) 单击【执行】按钮,执行上述SQL脚本,其结果如图4.33所示。


图4.33 运行结果


(3) 继续在【查询编辑器】中输入下面的SQL脚本代码:

SELECT *
FROM sys.dm_exec_requests



(4) 单击【执行】按钮后的结果如图4.34所示。

(5) 由图4.33和图4.34可以看出系统视图Sys.Sysprocesses和动态管理视图sys.dm_exec_requests中都提供了与当前进程相关的sql_handle,以及与该进程相关的命令。因此,可通过从这两个视图中获取所需的sql_handle,然后再使用系统函数fn_get_sql来获取该进程正在执行的SQL文本。在【查询编辑器】中输入下列的SQL脚本代码:

DECLARE @Handle VARBINARY(64);
SELECT @handle = sql_handle
    FROM master.dbo.sysprocesses
    WHERE spid = @@SPID
SELECT * FROM ::fn_get_sql(@Handle);
GO




图4.34 运行结果



提示     
上述代码中变量@@SPID为当前正在执行的SPID,显然,该SPID应指向查询语句SELECT @handle = sql_handle FROM master.dbo.sysprocesses WHERE spid =@@SPID。在通过上述查询语句获得一个sql_handle后,就可以使用系统函数fn_get_sql来获得该sql_handle所指定的进程的SQL文本了,如图4.35所示。


图4.35 运行结果  


提示     
仔细观察上面的系统函数使用方法就会发现,使用fn_为前缀的系统函数时,需要加带前缀符::。  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号