您好,我有一个名为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>
答案 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