当我从 2012 system_health 扩展事件中删除死锁 XML 时,SQL Server 没有返回所有节点信息。
当我运行以下查询时
SELECT CAST(event_data.value('(event/data/value)[1]','varchar(max)') AS XML) AS DeadlockGraph
FROM (
SELECT XEvent.query('.') AS event_data
FROM ( -- Cast the target_data to XML
SELECT CAST(target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets st
INNER JOIN
sys.dm_xe_sessions s
ON s.address = st.event_session_address
WHERE name = 'system_health'
AND target_name = 'ring_buffer'
) AS Data -- Split out the Event Nodes
CROSS APPLY
TargetData.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData ( XEvent )
) AS tab ( event_data )
在我们的 Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 实例中,所有节点信息连同描述一起返回,即
<deadlock>
<victim-list>
<victimProcess id="process10e26bc8" />
</victim-list>
<process-list>
<inputbuf>
Proc [Database Id = 26 Object Id = 1641213047]
</inputbuf>
</process-list>
...
...
...
</deadlock>
但是,当我针对我们的 Microsoft SQL Server 2012 - 11.0.5548.0 实例运行它时,所有节点信息和描述都被删除,只返回文本,即
Proc [Database Id = 26 Object Id = 1641213047]
这可能是什么原因造成的?如果我从查询中删除该SELECT CAST(event_data.value('(event/data/value)[1]','varchar(max)')
部分,则会在我们的 2012 实例中输出完整的 XML 层次结构。
根据http://www.red-gate.com/community/books/accidental-dba [SQL Server 故障排除:意外 DBA 指南],这看起来是设计使然。
附加信息:SQL Server 2012 中的扩展事件更改 – XML 数据元素的事件 XML
您的查询与我最终使用的查询有点不同,但我实际上解析了一些信息,而不仅仅是返回 XML。
您的查询中看起来不正确的特定部分是在外部 FROM 中
AS tab ( event_data )
,然后您event_data.value
在 top中引用它SELECT
。我会把它改成只有
AS tab
然后CROSS APPLY
在你的SELECT
. 所以它就像这样: