Как извлечь значение из столбца с данными XML - PullRequest
0 голосов
/ 30 сентября 2018

Здравствуйте, у меня есть таблица с именем KNXRUNHISTORY, и я пытаюсь извлечь данные из столбца с именем RUNSUMMARYTXT.

Данные, хранящиеся в этом столбце, представлены в формате xml.Я пытаюсь получить значения для этих двух полей (ключ ввода = "Link1. @ OutputType @) и (ключ ввода =" Link6. @ SourceRecordsProcessed @)

Любая помощь будет оценена, так как я трахаю свойвозглавьте стену на этом.

<?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>  

1 Ответ

0 голосов
/ 01 октября 2018

Общая идея состоит в том, чтобы использовать запрос 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...