簡體   English   中英

Xquery性能以返回頂級

[英]Xquery performance in order to return top levels

我有一個很大的XML文件,並且使用批量加載來接收它。 我的文件示例如下:

<Root Parts="Mypart">  
.
.
<part number="100000">  
<PT pt1="1" pt2="2" ... pt5="5"/>
.
.
<PT pt6="6" pt7="7" ... pt9="9"/>
</part>
.
.
</Root>  

因為我需要保存零件的屬性以及零件的​​編號,所以我使用“ ../../ ”來獲取零件的編號,並且在SQL表中的輸出如下所示:

100000 1 2 3 4 5
.
.
100000 6 7 8 9 

但是它的表現不好。 有什么辦法增加它嗎? 謝謝。

編輯:根據您當前的查詢下面的評論是

select t.n.value('(../../@number)[1]','nvarchar(100)') num 
      ,t.n.value('(.//@pt1[1]','nvarchar(10)')) A1 
      ,t.n.value('(.//@pt2[1]','nvarchar(10)')) A2 
      ,t.n.value('(.//@pt1[3]','nvarchar(10)')) A3 
FROM @XmlFile.nodes('Root/Parts[sql:variable("@cnt")]/part/pt') AS t(n)

您有很多昂貴且絕對不需要的XPath遍歷方法。 像這樣嘗試:

DECLARE @XmlFile XML=
'<Root Parts="Mypart">  
<part number="100000">  
<PT pt1="1" pt2="2"  pt5="5"/>
<PT pt6="6" pt7="7" pt9="9"/>
</part>
<part number="20000">  
<PT pt1="1" pt2="2"  pt5="5"/>
<PT pt6="6" pt7="7" pt9="9"/>
</part>
</Root>';

select @XmlFile.value('/Root[1]/@Mypart','nvarchar(max)') AS MyPart
      ,Part.value('@number','nvarchar(100)') num --might be numeric...
      ,PT.value('@pt1','nvarchar(10)') A1 
      ,PT.value('@pt2','nvarchar(10)') A2 
      ,PT.value('@pt5','nvarchar(10)') A5 
      ,PT.value('@pt6','nvarchar(10)') A6
      ,PT.value('@pt7','nvarchar(10)') A7 
      ,PT.value('@pt9','nvarchar(10)') A9 
FROM @XmlFile.nodes('Root/part') AS One(Part)
CROSS APPLY Part.nodes('PT') AS The(PT)

然后是這個@cnt變量。 這會將輸出限制為第n ^個元素。您在“ Parts”的第n ^個元素上進行了設置,但是您的示例僅具有“ Parts”屬性。您沒有顯示完整的XML,但是我想是有問題的...您是否循環遍歷此XML? 這將減慢整個過程...

有關XPath過濾器的一些提示:

DECLARE @xml XML='<root> 
                  <a filter="hallo" test="100"/>
                  <a filter="" test="200"/>
                  <a test="300"/>
                  <a test="400"/>
                  <a test="500"/>
                  </root>';
SELECT a.value('@test','int') AS test FROM @xml.nodes('/root/a[3]') AS One(a);
--Just "300" -> the third element
SELECT a.value('@test','int') AS test FROM @xml.nodes('/root/a[@test=3]') AS One(a);
--nothing
SELECT a.value('@test','int') AS test FROM @xml.nodes('/root/a[@filter="hallo"]') AS One(a);
--"100", due to filter=hallo

如果您真的只想閱讀一個特殊的部分(如注釋中提到的查詢),則可以添加如下過濾器:

FROM @XmlFile.nodes('Root/part[@number=sql:variable("@cnt")]') AS One(Part)

暫無
暫無

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

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