【问题标题】:How to replace STRING_AGG and CONCAT in MS SQL Server 2008?如何在 MS SQL Server 2008 中替换 STRING_AGG 和 CONCAT?
【发布时间】:2020-07-31 08:27:06
【问题描述】:

我使用的是MS SQL Server 2008,这个服务器版本不支持CONCATSTRING_AGG等一些有用的功能,但在我的工作中确实需要它们。 我可以有哪些变体来替换 MS SQL Server 2008 中的这些功能?

重要提示!我无法将服务器更新到新版本。

更好理解的代码:

SELECT Pt.ImagePath, STRING_AGG(Pt.DamageData, '') DamageData 
FROM @PreTable AS Pt 
GROUP BY ImagePath 
ORDER BY DamageData

【问题讨论】:

  • 升级到支持的 SQL Server 版本。 2008 完全不受支持,因此升级是迄今为止最好的解决方案。你说你别无选择,但如果这是真的,你应该告诉我们原因;因为几乎没有任何情况下您永远无法升级。
  • STRING_AGG 可以通过 gotqn 的回答中的 XML 支持来处理。 CONCAT 可以通过将所有列类型转换为文本数据类型并“将它们相加”来处理。 select concat('abc', '-', 123); 等于 select 'abc' + '-' + cast(123 as nvarchar(10));
  • ListAGG in SQLSERVER的可能重复

标签: sql sql-server tsql legacy


【解决方案1】:

试试这个:

WITH DataSoruce AS
(
    SELECT DISTINCT ImagePath
    FROM @PreTable
)
SELECT DS.ImagePath
      ,C.DamageData
FROM DataSoruce DS
CROSS APPLY
(
    SELECT '' + Pt.DamageData
    FROM @PreTable P
    WHERE P.ImagePath = DS.ImagePath
    FOR XML PATH('')
) C (DamageData);

【讨论】:

  • @AndreyVaulin,有关 XML PATH 技术和其他注意事项的详细说明,请参阅 this answer
  • 你为什么要离开'' +?答案也应该使用outer apply,相当于OP的代码。
  • 如果没有''+,您将获得<DamageData>...</DamageData> 连接标签。我们在CTE 中使用DISTINCT ImagePath,所以肯定会有匹配。无需使用OUTER APPLY
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多