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