我们有一个关键的业务流程(由第三方编写)由数十个大型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进行演示和放大分析
答案 0 :(得分:0)
我相信您正在寻找sys.dm_exec_query_stats
DMV。
它引用了与SQL_Handle
相同的sys.dm_exec_sql_text
值,但关键是它可以帮助您根据{{1}标识过程中的各个部分(以及统计信息) }和statement_start_offset
列:
statement_end_offset