久久久久久久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在线播放 | 国产超碰人人爽人人做人人爱 | aaa一区| 国产免费国产 | 天天干天天想 | 亚洲精品一| 韩日av在线 | 亚洲专区在线 | 91一区| 黄色在线观看国产 | 久久久视 | 欧美一级欧美一级在线播放 | 欧美一级久久 | 中文字幕亚洲视频 | 日韩一区二区三区四区五区 | 在线91| 亚洲色图插插插 | 亚洲成人精品 | 精品国产一区二区三区观看不卡 | 一区二区三区免费 | 91精品国产综合久久小仙女图片 | 国产精品久久久久无码av | 免费看黄色小视频 | 免费一区二区三区 | 久久精品无码一区二区三区 | 欧美一区二区成人 | 日韩在线免费电影 | 亚洲区一区二 | 欧美 中文字幕 | 久久精品手机视频 | 亚洲电影一级片 | 三级视频国产 | 成人免费观看男女羞羞视频 | 99热这里都是精品 | 在线国产一区 | 欧美一级欧美三级在线观看 | 国产精品久久久久久久久久久久 | 免费在线观看黄网站 | 中文字幕乱码亚洲精品一区 | 国产精品资源在线 | 久草新在线|