如何在tsql存储过程中捕获最后一个命令(用于记录目的)

时间:2015-10-07 11:40:51

标签: sql-server sql-server-2008 tsql stored-procedures logging

我们有一个关键的业务流程(由第三方编写)由数十个大型tsql存储过程组成(有些是2000多行tsql - 几十个嵌入式IF&条件逻辑 - 调试的噩梦)。这些过程的多个实例同时运行。

这些程序相互调用,堆栈可能非常深,即ProcA调用ProcB,ProcB调用ProcC& ProcC可以调用ProCD - 你得到了图片。

延迟正在进入这个过程(主要是网络延迟查询第三方链接服务器)。我们希望在程序中添加量身定制的事件记录,以监控关键插入,更新和更新。等等。

SQL Profiler工作正常,但非常不方便,需要一个更加永久的监控系统,允许非开发人员监控系统,处理通信问题等。

目前,我们使用存储过程中关键点的简单字符串进行日志记录,例如:

DECLARE @logstr VARCHAR(MAX) = '[' + OBJECT_NAME(@@PROCID) + '] INSERT into tbl_whatever with values 1, 5 & 6'

usp_log @logstr --#### This proc records the string to a table along with datetime etc

正如您所看到的,这非常冗长,并且使代码混乱。此外,必须输入@logstr刚执行的命令需要时间并且容易出错。如果我们能够自动检索(并记录)最后运行的语句(理想情况下使用任何变量值),那会好得多。

我知道你可以在tsql程序中使用DBCC INPUTBUFFER(@@SPID) - 但这显然只是返回对程序&不是程序中的最后一个命令。

我还尝试在一个过程中使用sys.dm_exec_sql_text,但这只返回CREATE PROCEDURE文本,而不是过程中的最后一个语句。

有没有办法查询过程中执行的最后一个语句?

如果没有,是否有更好的方法来记录存储过程的内部工作(和时间)(使用过程名称和日期时间)&将结果导入SQL进行演示和放大分析

1 个答案:

答案 0 :(得分:0)

我相信您正在寻找sys.dm_exec_query_stats DMV。

它引用了与SQL_Handle相同的sys.dm_exec_sql_text值,但关键是它可以帮助您根据{{1}标识过程中的各个部分(以及统计信息) }和statement_start_offset列:

statement_end_offset