我一直在試圖使用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()的正確路徑,但是我無法得到我所需要的。
任何人都可以幫忙嗎?
我轉到鏈接,切碎僵局XML是[這裏](HTTP://博客。 waynesheffield.com/wayne/code-library/shred-deadlock-graph/) –
感謝馬丁,這幫助了很多。看起來我在CROSS APPLY的正確道路上,我只需要使用一個額外的(當你考慮它時顯而易見)。我會回覆提供答案的完整腳本。 再次感謝。 – jamiet