【发布时间】:2016-10-05 17:30:39
【问题描述】:
假设我有一个包含相应 XML 元数据文件的文档,如下所示。此 XML 文件包含与文档有关的索引字段:
<Document>
<Indices>
<IndexField>
<indexName>DOCID</indexName>
<indexValue>49626502</indexValue>
</IndexField>
<IndexField>
<indexName>EMPLOYEEID</indexName>
<indexValue>248572405</indexValue>
</IndexField>
<IndexField>
<indexName>LASTNAME</indexName>
<indexValue>BROWN</indexValue>
</IndexField>
<IndexField>
<indexName>FIRSTNAME</indexName>
<indexValue>RALPH</indexValue>
</IndexField>
<IndexField>
<indexName>CITY</indexName>
<indexValue>PORTLAND</indexValue>
</IndexField>
<IndexField>
<indexName>STATE</indexName>
<indexValue>OR</indexValue>
</IndexField>
</Indices>
</Document>
我已将 XML 文件加载到一个 SQL 表中,然后我将在其中提取属性值并将它们加载到另一个表中。我有数千个这样的文件。生成元数据文件的方式,如果源系统没有填充字段,比如 CITY 或 STATE,则不会在文件中创建 XML 标记。我遇到的挑战是元数据文件缺乏一致性或一致性,因为一个可能比另一个具有更多的索引值(基于源系统中填充的内容与空白的内容)。
这是我如何提取属性以加载到不同的表中:
SELECT
DOCID = CASE WHEN XMLDATA.exist('/Document/Indices/IndexField[indexName="DOCID"]') = 1 then XMLData.value('(//*[local-name()="indexValue"])[1]','varchar(max)') else NULL end,
EMPLOYEEID = CASE WHEN XMLDATA.exist('/Document/Indices/IndexField[indexName="EMPLOYEEID"]') = 1 then XMLData.value('(//*[local-name()="indexValue"])[2]','varchar(max)') else NULL end,
LASTNAME = CASE WHEN XMLDATA.exist('/Document/Indices/IndexField[indexName="LASTNAME"]') = 1 then XMLData.value('(//*[local-name()="indexValue"])[3]','varchar(max)') else NULL end,
FIRSTNAME = CASE WHEN XMLDATA.exist('/Document/Indices/IndexField[indexName="FIRSTNAME"]') = 1 then XMLData.value('(//*[local-name()="indexValue"])[4]','varchar(max)') else NULL end
对于每个字段,我首先运行它以确保它存在于 XML 文件中:
XMLDATA.exist('/Document/Indices/IndexField[indexName="DOCID"]') = 1
然后,我为 indexValue 拉一个位置值:
XMLData.value('(//*[local-name()="indexValue"])[1]','varchar(max)')
我遇到的问题是,如果文件中缺少 XML 标记,它会丢弃后续字段的位置 indexValue。
我的问题是 - 基于提供的 XML 格式,我如何推断给定 indexName 的 indexValue?
【问题讨论】: