Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql XML查询将属性提取为记录/行_Sql_Sql Server 2008_Tsql_Xquery - Fatal编程技术网

Sql XML查询将属性提取为记录/行

Sql XML查询将属性提取为记录/行,sql,sql-server-2008,tsql,xquery,Sql,Sql Server 2008,Tsql,Xquery,我有下面的xml,希望以行的形式获取所有记录。我的xml如下所示 <category ccode="ct8"> <columns> <col colcode="cl_prodn" displaytext="Prodname" responsetype="textbox" tooltip="testts" isrequired="" displayorder="1" /> <col colcode="cl_descs" displayt

我有下面的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>

分解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)

谢谢你的意见。真的很有帮助。
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)