循环 XML 数据
Loop on XML data
在我的 SQL 服务器 table 中,一列的数据类型为 XML。它包含的数据为:
<P1>
<P2>
<P3 name='[1] name1', value='val1'> </P3>
<P3 name='[2] name2', value='val2'> </P3>
<P3 name='[3] name3', value='val3'> </P3>
</P2>
</p1>
我正在使用查询获取 name1、name2、name3:
select top(1)
col.value('(/P1[1]/P2[1]/P3/@name)[1]', 'VARCHAR(max)') as q1,
col.value('(/P1[1]/P2[1]/P3/@name)[2]', 'VARCHAR(max)') as q2,
col.value('(/P1[1]/P2[1]/P3/@name)[3]', 'VARCHAR(max)') as q3,
FROM table
我如何循环此数据以获取所有名称。类似于:
declare @x=1
while @x<4:
begin
select top(1)
col.value('(/P1[1]/P2[1]/P3/@name)[@x]', 'VARCHAR(max)') as q@x
from table
set @x=@x+1
end
还有如何在同一个 XML 上循环以获取所有值?
我冒昧地让您的 XML 格式正确。 SQL 服务器 XQuery .nodes()
方法和 CROSS APPLY
正在提供您想要的东西。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata)
VALUES
(N'<P1>
<P2>
<P3 name="[1] name1" value="val1">
</P3>
<P3 name="[2] name2" value="val2">
</P3>
<P3 name="[3] name3" value="val3">
</P3>
</P2>
</P1>');
-- DDL and sample data population, end
SELECT tbl.ID
, c.value('@name','VARCHAR(30)') AS [name]
, c.value('@value','VARCHAR(30)') AS [value]
FROM @tbl AS tbl
CROSS APPLY tbl.xmldata.nodes('/P1/P2/P3') AS t(c);
Output
+----+-----------+-------+
| ID | name | value |
+----+-----------+-------+
| 1 | [1] name1 | val1 |
| 1 | [2] name2 | val2 |
| 1 | [3] name3 | val3 |
+----+-----------+-------+
在我的 SQL 服务器 table 中,一列的数据类型为 XML。它包含的数据为:
<P1>
<P2>
<P3 name='[1] name1', value='val1'> </P3>
<P3 name='[2] name2', value='val2'> </P3>
<P3 name='[3] name3', value='val3'> </P3>
</P2>
</p1>
我正在使用查询获取 name1、name2、name3:
select top(1)
col.value('(/P1[1]/P2[1]/P3/@name)[1]', 'VARCHAR(max)') as q1,
col.value('(/P1[1]/P2[1]/P3/@name)[2]', 'VARCHAR(max)') as q2,
col.value('(/P1[1]/P2[1]/P3/@name)[3]', 'VARCHAR(max)') as q3,
FROM table
我如何循环此数据以获取所有名称。类似于:
declare @x=1
while @x<4:
begin
select top(1)
col.value('(/P1[1]/P2[1]/P3/@name)[@x]', 'VARCHAR(max)') as q@x
from table
set @x=@x+1
end
还有如何在同一个 XML 上循环以获取所有值?
我冒昧地让您的 XML 格式正确。 SQL 服务器 XQuery .nodes()
方法和 CROSS APPLY
正在提供您想要的东西。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata)
VALUES
(N'<P1>
<P2>
<P3 name="[1] name1" value="val1">
</P3>
<P3 name="[2] name2" value="val2">
</P3>
<P3 name="[3] name3" value="val3">
</P3>
</P2>
</P1>');
-- DDL and sample data population, end
SELECT tbl.ID
, c.value('@name','VARCHAR(30)') AS [name]
, c.value('@value','VARCHAR(30)') AS [value]
FROM @tbl AS tbl
CROSS APPLY tbl.xmldata.nodes('/P1/P2/P3') AS t(c);
Output
+----+-----------+-------+
| ID | name | value |
+----+-----------+-------+
| 1 | [1] name1 | val1 |
| 1 | [2] name2 | val2 |
| 1 | [3] name3 | val3 |
+----+-----------+-------+