簡體   English   中英

從 SQL 服務器數據庫中的列中的 XML 數據返回數據

[英]Returning data from XML data in a column in a SQL Server database

嘗試從 SQL 服務器表中的列中提取數據。 然而,該列不是XML類型,但數據采用 XML 格式(見下文)。 我可以通過CAST function 提取我需要的數據,但我想看看是否有更有效的查詢來這樣做。

以下數據存在於表FoodTabledetails列中。 我想查詢表格以獲取<FoodCity>中所有“產品”(即蘋果、藍莓、櫻桃)的列表。 數據實際上要大得多,所以如果可能的話,希望能幫助您進行更高效的查詢。

我有以下內容:

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>

雖然我上面的查詢有效,但如果可能的話,只是希望讓它更高效、更簡單。

預計 Output | 產品 |

| 蘋果 | | 藍莓 | | 櫻桃 |

謝謝你。

在等待您的 DDL 和示例數據填充時。 這是一個概念性的例子。

它使用 XQuery 方法.nodes().value()分解 XML 並將其轉換為矩形/關系格式。

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);

Output

+-----------+-------+
|  product  | price |
+-----------+-------+
| apple     |  1.00 |
| blueberry |  2.00 |
| cherry    |  5.00 |
| pear      |  3.00 |
| peach     |  4.00 |
| kiwi      |  6.00 |
+-----------+-------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM