从列中读取子 XML 节点

问题描述 投票:0回答:1

我的任务是处理依赖于 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]”的第六项,但是在获取第六项后如何继续“向下钻取”呢? (如果措辞有错误请见谅)

sql sql-server xml syntax
1个回答
0
投票

看来你只需要添加路径的其余部分,

/data[1]
例如

SELECT 
    (CAST(MARCData AS xml)).value('(/asset/field)[6]/data[1]', 'varchar(255)')
© www.soinside.com 2019 - 2024. All rights reserved.