在sql中展平xml数据

时间:2016-03-31 10:05:25

标签: sql sql-server xml

我试图在SQL查询中展平XML数据,但我似乎总是得到空值。

我尝试了here描述的交叉/外部应用方法。

包含XML数据的列称为Data

我猜测带有这些链接的xml数据是否需要以某种方式添加?

您能帮忙获得正确的SQL查询吗?

我试过查询:

SELECT
 v.name
 ,pref.value('(LocalId/text())[1]', 'nvarchar(10)') as localid
FROM [database].[requests] v
outer apply v.Data.nodes('/DataForm') x(pref)
GO

该列中xml数据的示例:

  <Dataform xmlns="http://somelongasslink.org/hasalsosomestuffhere" xmlns:i="http://somexlmschemalink/">
    <DeleteDate xmlns="http://somelongasslink.org/hasalsosomestuffhere" i:nil="true" />
    <LocalId xmlns="http://somelongasslink.org/hasalsosomestuffhere">5325325</LocalId>
  ...

1 个答案:

答案 0 :(得分:2)

您可以使用此代码获取您正在寻找的结果:

;WITH XMLNAMESPACES(DEFAULT 'http://somelongasslink.org/hasalsosomestuffhere')
SELECT
    rq.Name,
    LocalID = TC.value('(LocalId)[1]', 'nvarchar(10)') 
FROM 
     [database].[requests] rq
CROSS APPLY
    rq.Data.nodes('/Dataform') AS TX(TC)
GO

您的代码存在两个问题:

  1. 您不尊重/包含在XML文档中定义的 XML命名空间

    <Dataform xmlns="http://somelongasslink.org/hasalsosomestuffhere" 
              *******************************************************
    
  2. 您在调用.nodes()时没有注意XML的区分大小写 - 您需要使用.nodes('/Dataform')(不是{ {1}} - 您的XML中/DataForm 大写)