sql. Отправка xml deadlock на почту

Пытаюсь решить проблему мониторинга deadlock, но при этом чтобы на почту отправлялся сам xml. Нашел код который выводит актуальную последнюю информацию и пытаюсь отправить вывод по почте:

declare @subject varchar(250)
select @subject = 'Deadlock reported on ' + @@servername

EXEC msdb.dbo.sp_send_dbmail
      
       @profile_name = 'Mail_Profile_Prod',
       @recipients='*********',
       @subject = @subject,
       @body_format = 'HTML',
       @body = 'A deadlock has been recorded.  Further information can be found in the attached file.',
       @query = 'set QUOTED_IDENTIFIER on;
       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 TOP 1 
  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''
ORDER BY Execution_Time DESC',
      @query_result_width = 32767
      @attach_query_result_as_file = 1

Сообщение приходит, но текст в крайне обрезанном виде, подозреваю что надо как-то из вывода получить отдельно xml и посылать уже его. Но не могу разобраться как это можно сделать, или может есть альтернативы, в sql очень слаб. Пожалуйста помогите.

Как симулировать deadlock, чтобы появилась хоть одна запись, написано тут https://stackoverflow.com/questions/22825147/how-to-simulate-deadlock-on-sql-server

update Переписал

CREATE TABLE #errorlog (
            LogDate DATETIME 
            , ProcessInfo VARCHAR(100)
            , [Text] VARCHAR(MAX)
            );
DECLARE @tag VARCHAR (MAX) , @path VARCHAR(MAX), @deadlock xml, @body1 VARCHAR(MAX);
INSERT INTO #errorlog EXEC sp_readerrorlog;
SELECT @tag = text
FROM #errorlog 
WHERE [Text] LIKE 'Logging%MSSQL\Log%';
DROP TABLE #errorlog;

----------------

CREATE TABLE #res (
            DeadlockReport xml, 
            LogDate DATETIME
                   ); 
-------------------
SET @path = SUBSTRING(@tag, 38, CHARINDEX('MSSQL\Log', @tag) - 29);

insert into #res
SELECT top 1
  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'
ORDER BY Execution_Time DESC;

set @deadlock = (select [DeadlockReport] from #res)
--PRINT 'Deadlock: ' + CONVERT(VARCHAR(MAX), @deadlock);
set @body1 = CONVERT(VARCHAR(MAX), @deadlock)
print @body1
-------------------

declare @subject varchar(250)
select @subject = 'Deadlock reported on ' + @@servername

EXEC msdb.dbo.sp_send_dbmail
      
       @profile_name = 'Mail_Profile_Prod',
       @recipients='***************',
       @subject = @subject,
       @body_format = 'HTML',
       @body = @body1
       
   --    @query = 'set QUOTED_IDENTIFIER on;       print @deadlock;',
     -- @query_result_width = 32767,
     -- @attach_query_result_as_file = 1 
-------------------
DROP TABLE #res; 

на экран выдается все полностью

(3354 rows affected)

(1 row affected) unknown unknown UPDATE Employees SET Phone = N'555-9999' WHERE EmpId = 1 unknown unknown UPDATE Suppliers SET Fax = N'555-1212' WHERE SupplierId = 1 Mail (Id: 703) queued.

Completion time: 2021-01-16T17:20:01.9303778+03:00

А вот в почте обрезает все теги с <>

unknown unknown UPDATE Employees SET Phone = N'555-9999' WHERE EmpId = 1 unknown unknown UPDATE Suppliers SET Fax = N'555-1212' WHERE SupplierId = 1


Ответы (0 шт):