久久久久久久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)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 成人精品视频免费 | 久久爱一区 | 国产视频一区二区在线观看 | 四虎av电影 | 97精品视频在线观看 | 久久青| 中文一区| 成人3d动漫一区二区三区91 | 欧美日韩在线一区 | 亚州激情| 国产精品一区二区日韩 | 网站国产 | 国产一级电影在线观看 | 国产免费自拍 | 成人亚洲| 日本精品视频一区二区 | 亚洲综合在线网 | www.日韩av.com| 亚洲一区二区三区四区五区午夜 | 国产一级免费在线观看 | 免费久| 天天想天天干 | 婷婷久久久久 | 久久97精品| 羞视频在线观看 | 国产成人精品一区二三区在线观看 | 色天堂视频 | 中文在线一区二区 | 亚洲444kkkk在线观看最新 | 亚洲一区二区视频 | 一级黄色片美国 | 日韩靠逼 | 一级片免费视频 | 欧美美女爱爱 | 亚洲视频在线一区 | 日韩电影中文字幕 | 亚洲精视频 | 国产精品色 | 九九导航 | 91精品久久久久久久久99蜜臂 | 成人一区精品 |