2013-05-07 59 views
0

我有下面的XML,並希望獲取所有記錄作爲行。我的xml就像下面這樣..XML查詢獲取屬性作爲記錄/行

<category ccode="ct8"> 
    <columns> 
    <col colcode="cl_prodn" displaytext="Prodname" responsetype="textbox" tooltip="testts" isrequired="" displayorder="1" /> 
    <col colcode="cl_descs" displaytext="Descs" responsetype="textarea" tooltip="atser" isrequired="on" displayorder="2" /> 
    </columns> 
</category> 

我想要兩行類ccode = ct8。這兩行將顯示所有屬性。我正在嘗試以下查詢,但它只返回一個和第一個。

select CatConfig.value('(category/columns/col/@colcode)[1]', 'varchar(50)') from categories where CategoryId = 8 

回答

1

有很多方法來分解XML,但我相信這可以幫助你給一些概念來搭配:

declare @xml xml = 
'<category ccode="ct8"> 
    <columns> 
    <col colcode="cl_prodn" displaytext="Prodname" responsetype="textbox" tooltip="testts" isrequired="" displayorder="1" /> 
    <col colcode="cl_descs" displaytext="Descs" responsetype="textarea" tooltip="atser" isrequired="on" displayorder="2" /> 
    </columns> 
</category>' 

-- get them one at a time by hunting for specific identifier 
select @xml.query('(category/columns/col[@displaytext = "Prodname"])') -- queries for node 
select @xml.value('(category/columns/col[@displaytext = "Prodname"]/@colcode)[1]', 'varchar(max)') -- gives value of node by description 
select @xml.value('(category/columns/col[@displaytext = "Descs"]/@colcode)[1]', 'varchar(max)') 


-- get them all at once with the (reference).(column).nodes method applied to an xml value in a table. 
declare @X table (x xml); 

insert into @X values (@xml) 

select 
    t.query('.') 
, t.value('(@colcode)[1]', 'varchar(max)') 
from @X a 
cross apply a.x.nodes('//category/columns/col') as n(t) 
+0

感謝您的投入。真的有幫助。 – 2013-05-08 06:59:49

+0

沒問題,你的粉碎好運。 – djangojazz 2013-05-08 15:22:40