问题描述
尝试查询一些 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 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 |
+-----------+--------+----------+
,
假设使用 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)