【问题标题】:Query XML field in SQL Server在 SQL Server 中查询 XML 字段
【发布时间】:2014-08-21 21:51:18
【问题描述】:

我正在使用 sql server 2008 R2。我有具有以下结构的列 XXML 的表 X

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

我想解析上面的 XXML 列并返回如下输出:

CLOrderID                Rej       Sym        Tm
GGM-30-08/24/10          Preopen   A           06:36:29.524

【问题讨论】:

  • XML 结构总是一样的吗?意思是,/rec/set/Raw 和那 4 个属性(CLOrderID、Rej、Sym 和 Tm)?如果是这样,这应该相当简单。

标签: sql sql-server xml tsql sqlxml


【解决方案1】:

使用nodes() 分解XML 并使用value() 提取属性值。

select T.X.value('@CLOrderID', 'nvarchar(100)') as CLOrderID,
       T.X.value('@Rej', 'nvarchar(100)') as Rej,
       T.X.value('@Sym', 'nvarchar(100)') as Sym,
       T.X.value('@Tm', 'time(3)') as Tm
from dbo.X
  cross apply X.XXML.nodes('/rec/set/Raw') as T(X)

如果您确定您只会为每个 XML 提取一行,您可以直接获取属性值,而无需先分解。

select X.XXML.value('(/rec/set/Raw/@CLOrderID)[1]', 'nvarchar(100)') as CLOrderID,
       X.XXML.value('(/rec/set/Raw/@Rej)[1]', 'nvarchar(100)') as Rej,
       X.XXML.value('(/rec/set/Raw/@Sym)[1]', 'nvarchar(100)') as Sym,
       X.XXML.value('(/rec/set/Raw/@Tm)[1]', 'time(3)') as Tm
from dbo.X

【讨论】:

    【解决方案2】:

    这可以通过一些 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2012-10-18
      • 1970-01-01
      相关资源
      最近更新 更多