从 SQL 服务器数据库的列中的 XML 数据返回数据
Returning data from XML data in a column in a SQL Server database
正在尝试从 SQL 服务器 table 的列中提取数据。然而,该列不是 XML
类型,但数据采用 XML 格式(见下文)。我可以通过 CAST
函数提取我需要的数据,但我想看看是否有更有效的查询来这样做。
以下数据存在于 table FoodTable
的 details
列中。我想查询 table 以获取 <FoodCity>
中所有 'prod'(即苹果、蓝莓、樱桃)的列表。现实中的数据要大得多,所以如果可能的话,希望获得更高效查询的帮助。
我有以下内容:
SELECT
CAST(details AS xml).value('(//GROCER/prod[@key="apple"]/@key)[1]', 'nvarchar(max)') AS 'apple',
CAST(details AS xml).value('(//GROCER/prod[@key="blueberry"]/@key)[1]', 'nvarchar(max)') AS 'blueberry',
CAST(details AS xml).value('(//GROCER/prod[@key="cherry"]/@key)[1]', 'nvarchar(max)') AS 'cherry'
FROM
ABC.FoodTable
XML 看起来像这样:
<GROCER>
<FoodCity>
<prod key = 'apple' value = '1.00'>
<prod key = 'blueberry' value = '2.00'>
<prod key = 'cherry' value = '5.00'>
</FoodCity>
<DiscountGrocer>
<prod key = 'pear' value = '3.00'>
<prod key = 'peach' value = '4.00'>
<prod key = 'kiwi' value = '6.00'>
</DiscountGrocer>
</GROCER>
虽然我上面的查询有效,但只是希望尽可能提高效率和简化。
预期输出
|产品 |
|苹果 |
|蓝莓 |
|樱桃 |
谢谢。
在等待您的 DDL 和示例数据填充时。
这是一个概念性的例子。
它正在使用 XQuery 方法 .nodes()
和 .value()
分解 XML 并将其转换为 rectangular/relational 格式。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, details NVARCHAR(max));
INSERT INTO @tbl (details) VALUES
(N'<GROCER>
<FoodCity>
<prod key="apple" value="1.00"/>
<prod key="blueberry" value="2.00"/>
<prod key="cherry" value="5.00"/>
</FoodCity>
<DiscountGrocer>
<prod key="pear" value="3.00"/>
<prod key="peach" value="4.00"/>
<prod key="kiwi" value="6.00"/>
</DiscountGrocer>
</GROCER>');
-- DDL and sample data population, end
;WITH rs AS
(
SELECT id, CAST(details AS XML) AS xmldata
FROM @tbl
)
SELECT c.value('@key', 'VARCHAR(20)') AS product
, c.value('@value', 'DECIMAL(5,2)') AS price
FROM rs CROSS APPLY xmldata.nodes('/GROCER/*/prod') AS t(c);
输出
+-----------+-------+
| product | price |
+-----------+-------+
| apple | 1.00 |
| blueberry | 2.00 |
| cherry | 5.00 |
| pear | 3.00 |
| peach | 4.00 |
| kiwi | 6.00 |
+-----------+-------+
正在尝试从 SQL 服务器 table 的列中提取数据。然而,该列不是 XML
类型,但数据采用 XML 格式(见下文)。我可以通过 CAST
函数提取我需要的数据,但我想看看是否有更有效的查询来这样做。
以下数据存在于 table FoodTable
的 details
列中。我想查询 table 以获取 <FoodCity>
中所有 'prod'(即苹果、蓝莓、樱桃)的列表。现实中的数据要大得多,所以如果可能的话,希望获得更高效查询的帮助。
我有以下内容:
SELECT
CAST(details AS xml).value('(//GROCER/prod[@key="apple"]/@key)[1]', 'nvarchar(max)') AS 'apple',
CAST(details AS xml).value('(//GROCER/prod[@key="blueberry"]/@key)[1]', 'nvarchar(max)') AS 'blueberry',
CAST(details AS xml).value('(//GROCER/prod[@key="cherry"]/@key)[1]', 'nvarchar(max)') AS 'cherry'
FROM
ABC.FoodTable
XML 看起来像这样:
<GROCER>
<FoodCity>
<prod key = 'apple' value = '1.00'>
<prod key = 'blueberry' value = '2.00'>
<prod key = 'cherry' value = '5.00'>
</FoodCity>
<DiscountGrocer>
<prod key = 'pear' value = '3.00'>
<prod key = 'peach' value = '4.00'>
<prod key = 'kiwi' value = '6.00'>
</DiscountGrocer>
</GROCER>
虽然我上面的查询有效,但只是希望尽可能提高效率和简化。
预期输出 |产品 |
|苹果 | |蓝莓 | |樱桃 |
谢谢。
在等待您的 DDL 和示例数据填充时。 这是一个概念性的例子。
它正在使用 XQuery 方法 .nodes()
和 .value()
分解 XML 并将其转换为 rectangular/relational 格式。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, details NVARCHAR(max));
INSERT INTO @tbl (details) VALUES
(N'<GROCER>
<FoodCity>
<prod key="apple" value="1.00"/>
<prod key="blueberry" value="2.00"/>
<prod key="cherry" value="5.00"/>
</FoodCity>
<DiscountGrocer>
<prod key="pear" value="3.00"/>
<prod key="peach" value="4.00"/>
<prod key="kiwi" value="6.00"/>
</DiscountGrocer>
</GROCER>');
-- DDL and sample data population, end
;WITH rs AS
(
SELECT id, CAST(details AS XML) AS xmldata
FROM @tbl
)
SELECT c.value('@key', 'VARCHAR(20)') AS product
, c.value('@value', 'DECIMAL(5,2)') AS price
FROM rs CROSS APPLY xmldata.nodes('/GROCER/*/prod') AS t(c);
输出
+-----------+-------+
| product | price |
+-----------+-------+
| apple | 1.00 |
| blueberry | 2.00 |
| cherry | 5.00 |
| pear | 3.00 |
| peach | 4.00 |
| kiwi | 6.00 |
+-----------+-------+