我的任务是处理依赖于 SQL 数据库的库存系统中的数据。其中一列使用 XML 来存储制造商和型号信息等。我已经能够提取一些数据,但由于 XML 有一部分重复(“字段”),然后此后发生更多缩小,所以我没有成功。
MARCData 列中的 XML:
<asset>
<field>
<name>
<![CDATA[Instructional Classification]]>
</name>
<dataType></dataType>
<fieldID>34</fieldID>
<data>
<![CDATA[]]>
</data>
</field>
<field>
<name>
<![CDATA[Bin Location]]>
</name>
<dataType>Text</dataType>
<fieldID>51</fieldID>
<data>
<![CDATA[]]>
</data>
</field>
<field>
<name>
<![CDATA[Description]]>
</name>
<dataType>Text</dataType>
<fieldID>1</fieldID>
<data>
<![CDATA[Laptop]]>
</data>
</field>
<field>
<name>
<![CDATA[Replacement Price]]>
</name>
<dataType>Currency</dataType>
<fieldID>24</fieldID>
<data>
<![CDATA[]]>
</data>
</field>
<field>
<name>
<![CDATA[Manufacturer]]>
</name>
<dataType>Text</dataType>
<fieldID>202</fieldID>
<data>
<![CDATA[Lenovo]]>
</data>
</field>
<field>
<name>
<![CDATA[Model]]>
</name>
<dataType>Text</dataType>
<fieldID>203</fieldID>
<data>
<![CDATA[ThinkPad P17 Gen 2]]>
</data>
</field>
<field>
<name>
<![CDATA[Connections]]>
</name>
<dataType>Text</dataType>
<fieldID>1212</fieldID>
<data>
<![CDATA[Model Test']]>
</data>
</field>
</asset>
我到目前为止所做的代码:
SELECT
(CAST(MARCData AS xml)).value('(/asset/field)[6]', 'varchar(255)')
我正在获取“字段”的“第六”条目,但希望继续将结果限制为仅获取模型信息本身。上面列出的内容返回:
ModelText203ThinkPad P17 Gen 2
但我只需要它返回:
ThinkPad P17 第 2 代
我尝试在 [6] 之后添加更多限制项,但只是在 SQL 中出现语法错误:
(CAST(MARCData AS xml)).value('(/asset/field)[6](/name/data)', 'varchar(255)')
我知道如何“向下钻取”XML,并且知道如何获取带有某个标签“Field[6]”的第六项,但是在获取第六项后如何继续“向下钻取”呢? (如果措辞有错误请见谅)
看来你只需要添加路径的其余部分,
/data[1]
例如
SELECT
(CAST(MARCData AS xml)).value('(/asset/field)[6]/data[1]', 'varchar(255)')