为涉及一些大型/多查询 sp 的给定死锁捕获 XML 图。但是,不太确定如何解释 frame 元素的 stmtstart、stmtend 行来确定哪一行 sproc TSQL 遇到了死锁。第 214 行似乎没有与 SSMS 编辑器中的任何查询对齐,但我不确定引擎如何在行编号时规范化 sproc TSQL。如何使用 SSMS sproc 定义中显示的行号解析捕获的行号?
<frame procname="MyDB.dbo.MyRecordsCleanup" line="214" stmtstart="19333" stmtend="19435" sqlhandle="0x030005007c47eb4c669a8d004eaf000001000000000000000000000000000000000000000000000000000000">
exec sp_executesql @NSQL, N'@ARG1 int', @ARG1 = @MyArg1
</frame>
死锁报告中的行号和语句偏移量基于实际存储过程文本。SSMS 脚本将为粘性
QUOTED_IDENTIFIER
和添加额外的行ANSI_NULLS
,根据脚本选项(工具-->选项-->SQL Server 对象资源管理器-->脚本)添加注释,并更改文本以包含标识符或修复重命名的名称程序。因此,脚本过程中的偏移量和行号可能与实际文本不同。为了避免这种行为,从
sys.sql_modules
or中检索实际的 proc 定义OBJECT_DEFINITION
(根据@SolomonRutzky 的评论)并将结果复制/粘贴到新的查询窗口中,以便使用此查询进行分析:注意 SSMS 可能会根据查询结果选项截断大型过程的结果。确保为网格或文本结果检索的最大字符数大于您的进程大小。这是在工具-->选项-->查询结果-->SQL Server 下指定的。对于网格结果,确保选中复制或保存时保留 CR/LF 选项,因为它默认处于关闭状态。
检索带有文本结果的 proc 文本的另一个选项,
sp_helptext
注意检索的最大字符数大于最长行。