久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

SQL Server XML 處理:根據 ID 加入不同的節點

SQL Server XML Processing: Join different Nodes based on ID(SQL Server XML 處理:根據 ID 加入不同的節點)
本文介紹了SQL Server XML 處理:根據 ID 加入不同的節點的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正在嘗試使用 SQL 查詢 XML.假設我有以下 XML.

<數據集數據><text>ABC</text></dataSetData><一般數據><id>123</id><text>文本數據</text></generalData><一般數據><id>456</id><text>文本數據2</text></generalData><特殊數據><id>123</id><text>特殊數據文本</text></specialData><特殊數據><id>456</id><text>特殊數據文本2</text></specialData></xml>

我想編寫一個返回 2 行的 SELECT 查詢,如下所示:

DataSetData |通用數據ID |通用數據文本 |特殊數據測試ABC |123 |文本數據 |特殊數據文本ABC |第456話文本數據 2 |特殊數據文本 2

我目前的做法如下:

SELECTdataset.nodes.value('(dataSetData/text)[1]', 'nvarchar(500)'),general.nodes.value('(generalData/text)[1]', 'nvarchar(500)'),special.nodes.value('(specialData/text)[1]', 'nvarchar(500)'),FROM @MyXML.nodes('xml') AS dataset(nodes)外部應用@MyXML.nodes('xml/generalData') AS general(nodes)外部應用@MyXML.nodes('xml/specialData') AS special(nodes)在哪里general.nodes.value('(generalData/text/id)[1]', 'nvarchar(500)') = special.nodes.value('(specialData/text/id)[1]', 'nvarchar(500))')

我不喜歡這里的是我必須使用 OUTER APPLY 兩次,而且我必須使用 WHERE 子句來 JOIN正確的元素.

因此我的問題是: 是否有可能以我不必以這種方式使用 WHERE 子句的方式構造查詢,因為我是可以肯定的是,如果文件變大,這會對性能產生非常負面的影響.

難道不能用一些XPATH語句JOIN正確的節點(即對應的generalDataspecialData節點)?

解決方案

您的 XPath 表達式完全關閉.

請嘗試以下操作.這是非常有效的.您可以使用大型 XML 測試其性能.

<塊引用>

SQL

-- DDL和樣本數據填充,開始聲明@xml XML =N'<xml><數據集數據><text>ABC</text></dataSetData><一般數據><id>123</id><text>文本數據</text></generalData><一般數據><id>456</id><text>文本數據2</text></generalData><特殊數據><id>123</id><text>特殊數據文本</text></specialData><特殊數據><id>456</id><text>特殊數據文本2</text></specialData></xml>';-- DDL和樣本數據填充,結束SELECT c.value('(dataSetData/text/text())[1]', 'VARCHAR(20)') AS DataSetData, g.value('(id/text())[1]', 'INT') AS GeneralDataID, g.value('(text/text())[1]', 'VARCHAR(30)') AS GeneralDataText, sp.value('(id/text())[1]', 'INT') AS SpecialDataID, sp.value('(text/text())[1]', 'VARCHAR(30)') AS SpecialDataTestFROM @xml.nodes('/xml') AS t(c)外部應用 c.nodes('generalData') AS general(g)外部應用 c.nodes('specialData') AS special(sp)WHERE g.value('(id/text())[1]', 'INT') = sp.value('(id/text())[1]', 'INT');

<塊引用>

輸出

+-------------+---------------+-----------------+----------------------------+------------+|數據集數據 |通用數據ID |通用數據文本 |特殊數據ID |特殊數據測試 |+-------------+---------------+-----------------+---------------+--------------+|ABC |123 |文本數據 |123 |特殊數據文本 ||ABC |第456話文本數據 2 |第456話特殊數據文本 2 |+-------------+---------------+-----------------+---------------+--------------+

I am trying to query XML with SQL. Suppose I have the following XML.

<xml>
    <dataSetData>
        <text>ABC</text>
    </dataSetData>
    <generalData>
        <id>123</id>
        <text>text data</text>
    </generalData>
    <generalData>
        <id>456</id>
        <text>text data 2</text>
    </generalData>
    <specialData>
        <id>123</id>
        <text>special data text</text>
    </specialData>
    <specialData>
        <id>456</id>
        <text>special data text 2</text>
    </specialData>
</xml>

I want to write a SELECT query that returns 2 rows as follows:

DataSetData | GeneralDataID | GeneralDataText | SpecialDataTest
ABC         | 123           | text data       | special data text
ABC         | 456           | text data  2    | special data text 2

My current approach is as follows:

SELECT 
    dataset.nodes.value('(dataSetData/text)[1]', 'nvarchar(500)'),
    general.nodes.value('(generalData/text)[1]', 'nvarchar(500)'),
    special.nodes.value('(specialData/text)[1]', 'nvarchar(500)'),
FROM @MyXML.nodes('xml') AS dataset(nodes)
   OUTER APPLY @MyXML.nodes('xml/generalData') AS general(nodes)
   OUTER APPLY @MyXML.nodes('xml/specialData') AS special(nodes)
WHERE 
    general.nodes.value('(generalData/text/id)[1]', 'nvarchar(500)') = special.nodes.value('(specialData/text/id)[1]', 'nvarchar(500)')

What I do not like here is that I have to use OUTER APPLY twice and that I have to use the WHERE clause to JOIN the correct elements.

My question therefore is: Is it possible to construct the query in a way where I do not have to use the WHERE clause in such a way, because I am pretty sure that this affects performance very negatively if files become larger.

Shouldn't it be possible to JOIN the correct nodes (that is, the corresponding generalData and specialData nodes) with some XPATH statement?

解決方案

Your XPath expressions are completely off.

Please try the following. It is pretty efficient. You can test its performance with a large XML.

SQL

-- DDL and sample data population, start
DECLARE @xml XML = 
N'<xml>
    <dataSetData>
        <text>ABC</text>
    </dataSetData>
    <generalData>
        <id>123</id>
        <text>text data</text>
    </generalData>
    <generalData>
        <id>456</id>
        <text>text data 2</text>
    </generalData>
    <specialData>
        <id>123</id>
        <text>special data text</text>
    </specialData>
    <specialData>
        <id>456</id>
        <text>special data text 2</text>
    </specialData>
</xml>';
-- DDL and sample data population, end

SELECT c.value('(dataSetData/text/text())[1]', 'VARCHAR(20)') AS DataSetData
    , g.value('(id/text())[1]', 'INT') AS GeneralDataID 
    , g.value('(text/text())[1]', 'VARCHAR(30)') AS GeneralDataText
    , sp.value('(id/text())[1]', 'INT') AS SpecialDataID 
    , sp.value('(text/text())[1]', 'VARCHAR(30)') AS SpecialDataTest
FROM @xml.nodes('/xml') AS t(c)
    OUTER APPLY c.nodes('generalData') AS general(g)
    OUTER APPLY c.nodes('specialData') AS special(sp)
WHERE g.value('(id/text())[1]', 'INT') = sp.value('(id/text())[1]', 'INT');

Output

+-------------+---------------+-----------------+---------------+---------------------+
| DataSetData | GeneralDataID | GeneralDataText | SpecialDataID |   SpecialDataTest   |
+-------------+---------------+-----------------+---------------+---------------------+
| ABC         |           123 | text data       |           123 | special data text   |
| ABC         |           456 | text data 2     |           456 | special data text 2 |
+-------------+---------------+-----------------+---------------+---------------------+

這篇關于SQL Server XML 處理:根據 ID 加入不同的節點的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個子標記轉換為具有多個分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個表創建視圖?)
Create calculated value based on calculated value inside previous row(根據前一行內的計算值創建計算值)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對?) - IT屋-程序員軟件開發技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 久草手机在线视频 | 人人插人人射 | 日韩欧美亚洲国产 | 国产在线视频一区二区 | 国产a√ | 亚洲天堂免费视频 | 综合网伊人 | 久久99精品久久久久久水蜜桃 | 97免费在线 | 中文字幕一区二区三区在线观看 | 综合网av| 国产a√| 欧美黄色一级视频 | 日本天堂网 | 99cao| 免费看黄色小视频 | 色婷婷中文字幕 | 欧美国产日韩一区二区 | 日韩精品在线一区二区 | 小日子的在线观看免费第8集 | 国产一二三 | 一区二区欧美日韩 | 亚洲精品影院 | 亚洲久久久久久 | 亚洲午夜精品 | 日韩一级免费 | 黄片毛片| 亚洲久久在线 | 自拍偷拍第五页 | www.成人网| 国产美女免费 | 亚洲黄色小视频 | 黄色一级片免费看 | 亚洲永久免费视频 | 青青草国产成人av片免费 | 一级特黄色片 | 欧美色综合网 | 在线观看a视频 | 三级黄色 | 国产在线视频一区二区 | 玖玖精品视频 |