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';
このT-SQLコードから生のXML出力を取得して、デッドロックグラフまたはより読みやすいテキストとして表示する方法はありますか?
Bcpアウトして、.xdl
として保存できます。あなたがそれを行うことができる多くの方法..例えばBCP OUT(私は xp_cmdshell を使用していますが、powershellまたは他の方法を使用できます)。
私の回答からコードを借用する (要件に応じてコードを調整する必要があります):
-.xdlファイルとしてbcp出力。これは、メールで送信されるデッドロックグラフです。毎回上書きされることに注意してください!!
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 !!