【问题标题】:Query Out XML Data查询出 XML 数据
【发布时间】:2021-03-11 12:49:47
【问题描述】:

试图查询出一些 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>

我有以下几点:

DECLARE @nameElement NVARCHAR(30) = '"LI_PROD"';

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

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

【问题讨论】:

  • 你能标记 DBMS 吗?
  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql xml database xquery-sql


【解决方案1】:

假设它是 SQL Server。

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 |
+-----------+--------+----------+

【讨论】:

  • 非常感谢,这似乎为我做到了 :) 并且也为未来学习,所以太好了!
【解决方案2】:

假设 SQL Server,这应该可以满足您的需求。

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)

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多