1

我有一张这样的桌子:

ID C1 C2 序列
1 这是我的重新 盟友长句 1
1 这是我的重新 存储在一个 2
1 这是我的重新 真的很糟糕的格式 3

而且我需要一些 SQL 查询或存储过程将其拉出,使其显示为“这是我的非常长的句子,以非常糟糕的格式存储”

select 
    case 
       when seq = '1' 
          then c1 else '' 
    end + stuff((select c2 from table t2 
                 where t2. id = t1.id and t2.seq = t1.seq
                 for xml path('')), 1, 1, '') 
from 
    table t1

我已经做到了,但它正在放入 XML,我不知道为什么。任何帮助表示赞赏。

4

2 回答 2

0

FOR XML将使用列名作为节点名,所以如果你有

SELECT someCol
FROM tbl
FOR XML PATH('')

你仍然会得到这样的 XML

<someCol>someValue</someCol>

这个连接技巧的要点是获得一个未命名的列,这样就没有节点名称,只有值。所以你只需要对值使用任何函数或计算来删除列名

在您的情况下,STUFF没有必要,因为您没有分隔符。

不要忘记使用, TYPE).value('text()[1]','nvarchar(max)')来防止 XML 转义/实体化。

select 
    c1 + (
        select case when 1=1 then c2 end
        from table t2 
        where t2.id = t1.id and t2.seq >= 2
        for xml path(''), type).value('text()[1]','nvarchar(max)')
from 
    table t1
where seq = '1';

当然,如果您使用的是 SQL Server 2017+,则可以使用STRING_AGG

select 
    c1 + string_agg(cast(c2 as nvarchar(max)), '')
from 
    table t1
group by t1.ID, t1.c1;
于 2021-06-14T21:22:12.167 回答
0

弄清楚了。for xml 并没有像我想的那样删除 XML,只删除前导字符,我不得不将 c1 转换为 nvarchar 导致一个未命名的列并且没有 xml:耸耸肩:

于 2021-06-14T19:00:16.810 回答