Вы можете использовать nodes
для фильтрации элементов внутри вашего xml по значению атрибута, а затем value
для извлечения необходимых вам данных:
;with x as(
SELECT CAST(data AS XML) AS [result]
FROM #temp
WHERE data LIKE '%<text>Abort</text>%'
)
select
t.s.value('.', 'nvarchar(max)') as object_name
from
x
cross apply
[result].nodes('//data[@name = "object_name"]/value') t(s)
Результат:
Редактировать
Один из способов получения database_name
заключается в добавлении еще одной nodes
фильтрации по тегам action
.Чтобы получить timestamp
, вы можете просто добавить value
в предложение select
, указав правильное выражение xpath:
;with x as(
SELECT CAST(data AS XML) AS [result]
FROM #temp
WHERE data LIKE '%<text>Abort</text>%'
)
select
t.s.value('.', 'nvarchar(max)') as [object_name]
, u.s.value('.', 'nvarchar(max)') as [database_name]
, [result].value('(/event/@timestamp)[1]', 'nvarchar(max)') as [timestamp]
from
x
cross apply
[result].nodes('//data[@name = "object_name"]/value') t(s)
cross apply
[result].nodes('//action[@name = "database_name"]/value') u(s)
Результаты с database_name
и timestamp
: