为什么将'; '添加到与"for xml 路径"组合的字段时标记会消失?



我想将某些值从子问场串联到字符串中。但是发生了什么事,我不明白。

当我使用此SQL时:

select (
    select t1.value 
--       + '; '
    from Table1 t1
        join Table2 t2 on t1.xId=t2.xId and t1.TypeId in (31,33)
    where t2.pId=1001
    for xml PATH('')
)
as ValuesAsString

我得到:

<value>value 1</value><value>value 2</value>

但是,当我删除' - '并再次运行查询时,输出变为:

value 1; value 2; 

为什么要删除XML标签?

我正在使用SQL Server 2008

尝试在没有XML功能的情况下运行内部查询。在原始查询中,它产生了一个名为value的单列的结果集,因为您直接从称为value的列中选择。

在更新的查询中,您可以获得一个带有单个未命名列的结果集,因为您正在选择 expression value。

因此,标签名称基于列名(或任何应用的别名),在更新的示例中,该列没有名称。而且由于无法在XML中具有未命名元素,因此省略了元素标签。

select (
    select t1.value 
       + '; ' as fruitbat
    from Table1 t1
        join Table2 t2 on t1.xId=t2.xId and t1.TypeId in (31,33)
    where t2.pId=1001
    for xml PATH('')
)
as ValuesAsString

将产生XML,并包含在<fruitbat>元素中的值。

,因为该列的名称用作FOR XML PATH('')中的元素名称。当您具有计算的表达式并且不提供列别名(... AS alias_namealias_name=...)时,列名不存在,因此没有元素名称呈现(空的XML元素名称无效)。

要删除列名,请选择列作为[text()]属性,例如

...
select [text()]=t1.value
...

更多信息:1,2。

最新更新