如何从具有XML数据的列中提取值

时间:2018-09-30 18:41:21

标签: sql-server xml-parsing

您好,我有一个名为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 :(得分:0)

通常的想法是使用 xpath查询来处理xml数据。但是您的情况有一些陷阱。
1.您的数据不是xml数据类型。 varchar(max)nvarchar(max)中列的数据类型最有可能。没关系,但是
2.您有<!DOCTYPE声明,需要进行转换with with style equals to 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