2013-05-07 61 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