查询出 XML 条数据

Query Out XML Data

尝试查询一些XML数据,数据结构如下。 (但行数更多)。

<FIELD>
  <ROW>
    <FIELD name="LI_PRODID">1</FIELD>
    <FIELD name="LI_QTY">3</FIELD>
    <FIELD name="CALC_UOM">1</FIELD>
  </ROW>
    <ROW>
        <FIELD name="LI_PRODID">2</FIELD>
        <FIELD name="LI_QTY">4</FIELD>
        <FIELD name="CALC_UOM">1</FIELD>
    </ROW>
</FIELD>

我有以下内容:

声明 @nameElement NVARCHAR(30) = '"LI_PROD"';

SELECT      
col.value('(FIELD/ROW/FIELD[name=sql:variable("@nameElement")])[1]', 'nvarchar(30)')
FROM
Table

我将如何实际获取不同行上的每个“LI_PRODID”作为一列,然后为每一行重复每个“LI_PRODID”?

假设 SQL 服务器,这应该给你你想要的。

declare @x xml = 
'<FIELD>
  <ROW>
    <FIELD name="LI_PRODID">1</FIELD>
    <FIELD name="LI_QTY">3</FIELD>
    <FIELD name="CALC_UOM">1</FIELD>
  </ROW>
    <ROW>
        <FIELD name="LI_PRODID">2</FIELD>
        <FIELD name="LI_QTY">4</FIELD>
        <FIELD name="CALC_UOM">1</FIELD>
    </ROW>
</FIELD>'




SELECT 
   ROWITEM.value('@name', 'varchar(10)')  as rc
from @x.nodes('(/FIELD/ROW/FIELD)') AS FIELD(ROWITEM)

假设它是 SQL 服务器。

XQuery .nodes().value() 方法生成您需要的内容。

您可能需要调整超出 INT 的数据类型。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<FIELD>
    <ROW>
        <FIELD name="LI_PRODID">1</FIELD>
        <FIELD name="LI_QTY">3</FIELD>
        <FIELD name="CALC_UOM">1</FIELD>
    </ROW>
    <ROW>
        <FIELD name="LI_PRODID">2</FIELD>
        <FIELD name="LI_QTY">4</FIELD>
        <FIELD name="CALC_UOM">1</FIELD>
    </ROW>
</FIELD>');
-- DDL and sample data population, end

SELECT c.value('(FIELD[@name="LI_PRODID"]/text())[1]', 'INT') AS LI_PRODID
    , c.value('(FIELD[@name="LI_QTY"]/text())[1]', 'INT') AS LI_QTY
    , c.value('(FIELD[@name="CALC_UOM"]/text())[1]', 'INT') AS CALC_UOM
FROM @tbl CROSS APPLY xmldata.nodes('/FIELD/ROW') AS t(c);

输出

+-----------+--------+----------+
| LI_PRODID | LI_QTY | CALC_UOM |
+-----------+--------+----------+
|         1 |      3 |        1 |
|         2 |      4 |        1 |
+-----------+--------+----------+