SQL Server中的查询XML字段

SQL Server中的查询XML字段,sql,sql-server,xml,tsql,sqlxml,Sql,Sql Server,Xml,Tsql,Sqlxml,我正在使用SQLServer2008R2。我有表X和列XXML,结构如下 <rec> <set> <Raw CLOrderID="GGM-30-08/24/10" Rej="Preopen" Sym="A" Tm="06:36:29.524" /> </set> </rec> 这可以通过几个for xml调用来完成。如果存在/rec/set/Raw/@*的话,此结构对于将来的模式更改也保持灵活。如果这种情况发生变化,则

我正在使用SQLServer2008R2。我有表X和列XXML,结构如下

<rec>
  <set>
    <Raw CLOrderID="GGM-30-08/24/10" Rej="Preopen" Sym="A" Tm="06:36:29.524" />
  </set>
</rec>

这可以通过几个for xml调用来完成。如果存在/rec/set/Raw/@*的话,此结构对于将来的模式更改也保持灵活。如果这种情况发生变化,则始终可以为要获取的属性添加具有新路径的管道。希望这有帮助

declare @x table (id int identity(1,1) primary key, x xml)
insert into @x (x) values ('<rec>
  <set>
    <Raw CLOrderID="GGM-30-08/24/10" Rej="Preopen" Sym="A" Tm="06:36:29.524" />
  </set>
</rec>')
select a.id, cast((
    select (
        select x.attribs.value('local-name(.)','nvarchar(20)') + ' '
        from @x t
            outer apply t.x.nodes('/rec/set/Raw/@*') x(attribs)
        where t.id = a.id
        for xml path('')
        ), (
        select x.attribs.value('.','nvarchar(20)') + ' '
        from @x t
            outer apply t.x.nodes('/rec/set/Raw/@*') x(attribs)
        where t.id = a.id
        for xml path('')
        )
    for xml path('')
) as varchar(500))
from @x a
使用节点分解XML并提取属性值

选择T.X.value'@CLOrderID',nvarchar100'作为CLOrderID, T.X.值“@Rej”,“nvarchar100”为Rej, T.X.值'@Sym',nvarchar100'为Sym, T.X.值'@Tm',时间3'为Tm 来自dbo.X 交叉应用X.XXML.nodes'/rec/set/Raw'作为发送 如果确定每个XML只提取一行,则可以直接获取属性值,而无需先分解

选择X.XXML.value“/rec/set/Raw/@CLOrderID[1]”,选择“nvarchar100”作为CLOrderID, X.XXML.value'/rec/set/Raw/@Rej[1],'nvarchar100'作为Rej, X.XXML.value'/rec/set/Raw/@Sym[1],'nvarchar100'作为Sym, X.XXML.value'/rec/set/Raw/@Tm[1],'time3'作为Tm 来自dbo.X
XML结构是否总是相同的?意思是,/rec/set/Raw和这4个属性CLOrderID、Rej、Sym和Tm?如果是这样,这应该相当简单。
declare @x table (id int identity(1,1) primary key, x xml)
insert into @x (x) values ('<rec>
  <set>
    <Raw CLOrderID="GGM-30-08/24/10" Rej="Preopen" Sym="A" Tm="06:36:29.524" />
  </set>
</rec>')
select a.id, cast((
    select (
        select x.attribs.value('local-name(.)','nvarchar(20)') + ' '
        from @x t
            outer apply t.x.nodes('/rec/set/Raw/@*') x(attribs)
        where t.id = a.id
        for xml path('')
        ), (
        select x.attribs.value('.','nvarchar(20)') + ' '
        from @x t
            outer apply t.x.nodes('/rec/set/Raw/@*') x(attribs)
        where t.id = a.id
        for xml path('')
        )
    for xml path('')
) as varchar(500))
from @x a