Общая идея состоит в том, чтобы использовать запрос xpath для XML-данных.Но в вашем случае есть некоторые подводные камни.
1. Ваши данные не относятся к типу данных xml.Скорее всего, тип данных столбца в varchar(max)
или nvarchar(max)
.Это было бы хорошо, но
2. У вас есть объявление <!DOCTYPE
, которое требует преобразования со стилем, равным 2 .Кодировка должна быть utf-16
(ваша utf-8
).Поэтому кодировка в объявлении xml должна быть исправлена или просто удалена.
Вот рабочий пример.
declare @tbl table (id int, prop nvarchar(max))
insert @tbl(id,prop) values(1,
N'<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Comment</comment>
<entry key="@InterfaceErrorCount@">0</entry>
<entry key="Link3.@LinkElapsedTime@">0:00:21</entry>
<entry key="Link1.@OutputType@">4</entry>
<entry key="Link6.@SourceRecordsProcessed@">148</entry></properties>')
;with cte as(
select id, convert(xml,
replace( prop,'<?xml version="1.0" encoding="UTF-8"?>',''),--sanitize data
2 --Enable limited internal DTD subset processing
) x --and then convert to xml data type
from @tbl
)
select t.v.value('entry[@key="Link1.@OutputType@"][1]','int') outputtype,
t.v.value('entry[@key="Link6.@SourceRecordsProcessed@"][1]','int') srcrecprocessed
from cte cross apply x.nodes('properties') t(v) -- use xpath query