如何将 XML 死锁文件转换为图形或可读的东西?

Sea*_*ins 4 xml sql-server deadlock

我正在寻找一种简单或易于管理的方式来读取 XML 文件,特别是 SQL Server 死锁的 XML 输出。由于各种原因,我有一些服务器没有受到监控。

我在interwebz 上找到了以下代码,但它的输出只是XML。

CREATE TABLE #errorlog (
                        LogDate DATETIME 
                        , ProcessInfo VARCHAR(100)
                        , [Text] VARCHAR(MAX)
                        );

DECLARE @tag VARCHAR (MAX) , @path VARCHAR(MAX);

INSERT INTO #errorlog EXEC sp_readerrorlog;

SELECT @tag = text
FROM #errorlog 
WHERE [Text] LIKE 'Logging%MSSQL\Log%';

DROP TABLE #errorlog;

SET @path = SUBSTRING(@tag, 38, CHARINDEX('MSSQL\Log', @tag) - 29);

SELECT 
    CONVERT(xml, event_data).query('/event/data/value/child::*') AS DeadlockReport,
    CONVERT(xml, event_data).value('(event[@name="xml_deadlock_report"]/@timestamp)[1]', 'datetime') 
    AS Execution_Time
FROM sys.fn_xe_file_target_read_file(@path + '\system_health*.xel', NULL, NULL, NULL)
WHERE OBJECT_NAME like 'xml_deadlock_report';
Run Code Online (Sandbox Code Playgroud)

有没有办法从这个 T-SQL 代码中获取原始 XML 输出并将其显示为死锁图或更容易阅读的文本?

Kin*_*hah 6

您可以 bcp out 并将其另存为.xdl. 很多方法都可以做到……例如BCP OUT(我使用的是xp_cmdshell,但您可以使用powershell 或任何其他方法)。

从我的答案中借用代码(您需要根据您的要求调整代码):

-- bcp 输出为 .xdl 文件。这是将通过电子邮件发送的死锁图。请注意,它每次都会被覆盖!!

exec master..xp_cmdshell ''BCP.exe "SELECT  [Deadlockgraph].query(''''/TextData/deadlock-list'''') FROM dba_db.dbo.Deadlock where Notified = 0" queryout "d:\logs\deadlock.xdl" -c -q -T -Slocalhost''; ---- change localhost ..with the servername\instance or servername !!
Run Code Online (Sandbox Code Playgroud)