2012-10-26 91 views
1

我有以下格式的XML:SQL Server:查詢XML列時,是否可以返回XML列?

<filters> 
    <filter name="filterByOperatingSystem"> 
    <parameters operatingSystem="Windows" /> 
    </filter> 
    <filter name="filterBySoftware"> 
    <parameter software="Office" /> 
    </filter> 
</filters> 

存儲在@XML

我想要做的是循環雖然每個過濾器,以便我可以做一些處理。

我的想法是,我可以在光標的參數元素一起抓住每一個過濾器的名字,但我可以得到到目前爲止最接近的是:

DECLARE crsDTO cursor static forward_only read_only for 
SELECT 
    tab.col.value('@name','NVARCHAR(64)') 
FROM 
    @XML.nodes('//filter') tab(col) 

我嘗試下面的查詢來看看我是否能獲取參數XML列:

DECLARE crsDTO cursor static forward_only read_only for 
SELECT 
    tab.col.value('@name','NVARCHAR(64)'), 
    tab.col.value('parameter[1]' 'XML') 
FROM 
    @XML.nodes('//filter') tab(col) 

但我得到的錯誤:

The datatype XML used in the value type is invalid

的Bec ause我的過濾器可以有不同的屬性,我不想試圖直接用第一個查詢來獲取屬性(我的想法是做光標,然後根據過濾器名稱,我可以從節點獲取特定參數),但無法獲得XML節點,我不知道如何去做這件事。

任何關於如何解決這個問題的建議?

+0

你預計從中獲取@procedure? – Mithrandir

+0

對不起,我的壞。當試圖將代碼縮小爲樣本大小時,我粘貼了錯誤的屬性名稱。搞掂。 – Kyle

回答

3

你需要這個?

DECLARE @XML xml = '<filters> 
    <filter name="filterByOperatingSystem"> 
    <parameters operatingSystem="Windows" /> 
    </filter> 
    <filter name="filterBySoftware"> 
    <parameter software="Office" /> 
    </filter> 
</filters>' 

SELECT 
    tab.col.value('@name','NVARCHAR(64)') as name, 
    tab.col.query('./*') as parameters 
FROM 
    @XML.nodes('//filter') tab(col) 

,如果這是可能的濾波器具有其他子元素類型,你可能要改變

tab.col.query('./*') as parameters 

tab.col.query('./parameters') as parameters 

tab.col.query('./parameter') as parameters 

什麼都正確的名稱是。

+0

不錯。我錯過了 。在我的回答:) –

1

您的xml在Filter節點之一中沒有Parameter元素,並且已將Parameters元素掛起。所以,如果你想獲得的所有元素,你應該寫*代替parameter[1]

declare @xml xml 

select @xml = '<filters> 
    <filter name="filterByOperatingSystem"> 
    <parameters operatingSystem="Windows" /> 
    </filter> 
    <filter name="filterBySoftware"> 
    <parameter software="Office" /> 
    </filter> 
</filters>' 

select @xml 

select 
    T.C.value('@name', 'nvarchar(64)'), 
    T.C.query('./parameter[1]') as parameters 
from @xml.nodes('/filters/filter') as T(C) 
2

使用.query()代替:

declare @xml xml = '<filters> 
    <filter name="filterByOperatingSystem"> 
    <parameters operatingSystem="Windows" /> 
    </filter> 
    <filter name="filterBySoftware"> 
    <parameter software="Office" /> 
    </filter> 
</filters>'; 

SELECT 
    tab.col.value('@name','NVARCHAR(64)'), 
    tab.col.query('.') 
FROM 
    @XML.nodes('//filter') tab(col)