2013-12-09 124 views
0

我一直在試圖使用T-SQL將一些XML碎化。這裏是我的XML(其中的一些可能會識別爲從死鎖圖形來):從XML中提取元素並將其轉換爲數據集

<resource-list> 
    <metadatalock subresource="DATA_SPACE" classid="data_space_id = 65601" dbid="7" id="lockb0553200" mode="X"> 
     <owner-list> 
     <owner id="process806e5b88" mode="Sch-S" /> 
     </owner-list> 
     <waiter-list> 
     <waiter id="process11e2cb708" mode="Sch-M" requestType="convert" /> 
     </waiter-list> 
    </metadatalock> 
    <objectlock lockPartition="0" objid="98099390" subresource="FULL" dbid="7" objectname="" id="lockbe2cfc00" mode="Sch-M" associatedObjectId="98099390"> 
     <owner-list> 
     <owner id="process11e2cb708" mode="Sch-M" /> 
     </owner-list> 
     <waiter-list> 
     <waiter id="process806e5b88" mode="Sch-S" requestType="wait" /> 
     </waiter-list> 
    </objectlock> 
    </resource-list> 

我想什麼是提取包含的每個子行的數據集(從那裏我相當有信心我可以使用value()函數來進一步細化它)。換句話說,我想這1列,2行數據集:

<metadatalock subresource="DATA_SPACE" classid="data_space_id = 65601" dbid="7" id="lockb0553200" mode="X"> 
    <owner-list> 
    <owner id="process806e5b88" mode="Sch-S" /> 
    </owner-list> 
    <waiter-list> 
    <waiter id="process11e2cb708" mode="Sch-M" requestType="convert" /> 
    </waiter-list> 
</metadatalock> 
<objectlock lockPartition="0" objid="98099390" subresource="FULL" dbid="7" objectname="" id="lockbe2cfc00" mode="Sch-M" associatedObjectId="98099390"> 
    <owner-list> 
    <owner id="process11e2cb708" mode="Sch-M" /> 
    </owner-list> 
    <waiter-list> 
    <waiter id="process806e5b88" mode="Sch-S" requestType="wait" /> 
    </waiter-list> 
</objectlock> 

(我可能沒有解釋這很好,基本上我想第1行中metadatalock節點,並在第2行的objectlock節點)。

這是我到目前爲止有:

SELECT XEventData.XEvent.query('/') 
FROM #resourceList 
CROSS APPLY [resource-list].nodes('//resource-list/') AS XEventData (XEvent) 

但只返回一個錯誤:

Msg 9341, Level 16, State 1, Line 3
XQuery [#resourceList.resource-list.nodes()]: Syntax error near '', expected a step expression.

因此我有點卡住了。我認爲我正在使用CROSS APPLY中的nodes()的正確路徑,但是我無法得到我所需要的。

任何人都可以幫忙嗎?

+0

我轉到鏈接,切碎僵局XML是[這裏](HTTP://博客。 waynesheffield.com/wayne/code-library/shred-deadlock-graph/) –

+0

感謝馬丁,這幫助了很多。看起來我在CROSS APPLY的正確道路上,我只需要使用一個額外的(當你考慮它時顯而易見)。我會回覆提供答案的完整腳本。 再次感謝。 – jamiet

回答

1

感謝馬丁·史密斯誰留下評論包含一個鏈接,使我這個解決方案:

DECLARE @xml XML = '<resource-list> 
    <metadatalock subresource="DATA_SPACE" classid="data_space_id = 65601" dbid="7" id="lockb0553200" mode="X"> 
    <owner-list> 
     <owner id="process806e5b88" mode="Sch-S" /> 
    </owner-list> 
    <waiter-list> 
     <waiter id="process11e2cb708" mode="Sch-M" requestType="convert" /> 
    </waiter-list> 
    </metadatalock> 
    <objectlock lockPartition="0" objid="98099390" subresource="FULL" dbid="7" objectname="" id="lockbe2cfc00" mode="Sch-M" associatedObjectId="98099390"> 
    <owner-list> 
     <owner id="process11e2cb708" mode="Sch-M" /> 
    </owner-list> 
    <waiter-list> 
     <waiter id="process806e5b88" mode="Sch-S" requestType="wait" /> 
    </waiter-list> 
    </objectlock> 
</resource-list>' 
IF OBJECT_ID('tempdb..#resourceList') IS NOT NULL 
    DROP TABLE #resourceList; 
SELECT [resource-list][email protected] 
INTO #resourceList 

SELECT MainLock.Process.query('.') AS node 
FROM #resourceList 
CROSS APPLY [resource-list].nodes('//resource-list') AS Lock (List) 
CROSS APPLY Lock.List.nodes('*') AS MainLock (Process) 

基本上只需要再次申請。我也不知道.nodes('*'),它也非常有用。

0

其實,沒有必要進行第二次CROSS APPLY ...節點():

SELECT Lock.List.query('.') AS node 
FROM #resourceList 
CROSS APPLY [resource-list].nodes('/resource-list/*') AS Lock (List) 

ML

+0

看,我*知道*你可以幫助馬提亞:) 謝謝,這真棒。 – jamiet

相關問題