Sql server - xml列查询返回带有多个根元素的结果

时间:2013-12-06 12:57:58

标签: sql-server xml xquery

我在SQL Server表(SQL Server 2012)中有一个XML列,其中包含以下数据:

<history>
   <status updatedAt="2013-09-01" />
   <status updatedAt="2013-08-12" />
   <status updatedAt="2013-05-10" />
   <status updatedAt="2013-04-01" />
</history>

问题是,当我用XQuery表达式查询它时,例如:

SELECT Statuses = StatusHistory.query('/history/status[@updatedAt >= @sql:variable("@start") and @updatedAt <= @sql:variable("@end")]')

返回以下结果:

<status updatedAt="2013-08-12" />
<status updatedAt="2013-05-10" />

这是无效的xml(包含多个根元素)。

有没有办法将query()方法的结果包装在一个根中,或者保留原始的xml结构?

1 个答案:

答案 0 :(得分:1)

这不是单个XML结果,而是一系列XML片段,每个XML片段都是格式良好的XML(从技术上讲,它没有任何模式就无法生效,发布的输入也是格式良好,无效)。

XQuery允许构建新结果:

SELECT Statuses = StatusHistory.query('
    <history>
    {
        /history/status
        [
            @updatedAt >= @sql:variable("@start") and 
            @updatedAt <= @sql:variable("@end"  )
        ]
    }
    </history>
')

作为替代方案,您可以创建XML片段的副本并删除想要的所有节点,但我认为此解决方案更直接。