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