2016-12-14 49 views
1

我想连接从一个子查询到字符串的一些值。但是有些事情我不明白。为什么标签在添加'时消失; '字段与'为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

回答

1

尝试不中的XML功能运行内部查询。在原始查询中,由于您直接从名为value的列中进行选择,因此它会生成一个名为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>元素中包含您的值。

0

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

要删除的列名,选择列作为[text()]财产,像

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

更多信息:12

相关问题