SQL Server如何从死锁XML数据中提取lastbatchstarted属性值
问题原因
你的XPath查询路径缺失了deadlock节点层级:从给出的XML结构可以看到,process-list是deadlock节点的子节点,而deadlock才是value节点的直接子节点,你原有路径跳过了deadlock层,所以无法匹配到目标节点。
修正后的查询语句
直接补全路径即可正常取值,代码如下:
[XML Data].value('(/event/data[@name="xml_report"]/value/deadlock/process-list/process/@lastbatchstarted)[1]','datetime')
特殊情况兼容处理
如果你的xml_report的value节点内存储的是转义后的XML字符串(不是直接嵌套的XML节点,多出现于旧版本SQL Server扩展事件存储结果),需要先将内容转为XML类型再取值,代码如下:
-- 先提取xml_report的字符串内容转为XML,再执行属性查询 CAST([XML Data].value('(/event/data[@name="xml_report"]/value/text())[1]','nvarchar(max)') AS XML) .value('(/deadlock/process-list/process/@lastbatchstarted)[1]','datetime')
补充说明
lastbatchstarted属性值本身不带时区标识,返回的datetime类型为SQL Server实例所在时区的本地时间- 如果需要精准取死锁牺牲进程的对应属性值,可以额外加条件筛选
process的id与victim-list下的victimProcess的id匹配
内容的提问来源于stack exchange,提问作者Avi
相关产品推荐
相关产品推荐

