SQL Server中使用+=拼接字符串时,ORDER BY含表达式会失效
SQL Server中+=字符串拼接结合ORDER BY表达式的异常问题
这确实是SQL Server的异常行为,已在2017和2022版本中复现:使用+=运算符从结果集构建字符串时,若ORDER BY子句包含列名以外的表达式,最终只会将排序后结果集的最后一行值拼接到字符串中,而非按预期顺序拼接所有行的值。
复现脚本
USE tempdb GO DECLARE @T TABLE ( A INT IDENTITY , B VARCHAR(50) ) INSERT @T (B) SELECT value FROM STRING_SPLIT('Now is the time for all good men to come to the aid of their country.', ' ') DECLARE @SQL NVARCHAR(MAX) = 'Start: ' SELECT @SQL += B + ' ' FROM @T SELECT @SQL --Works with ORDER BY without an expression SET @SQL = 'Start: ' SELECT @SQL += B + ' ' FROM @T ORDER BY A SELECT @SQL --Fails with an expression in ORDER BY; only returns the last row. SET @SQL = 'Start: ' SELECT @SQL += B + ' ' FROM @T ORDER BY LEFT(B, 1) SELECT @SQL --Works with STRING_AGG SELECT @SQL = STRING_AGG(B, ' ') WITHIN GROUP (ORDER BY LEFT(B, 1)) FROM @T SELECT @SQL
说明与替代方案
- 当
ORDER BY仅使用列名时,+=拼接行为符合预期,能按顺序拼接所有行; - 若需基于表达式排序并完成字符串拼接,推荐使用
STRING_AGG函数,如脚本最后一段所示,该函数是SQL Server 2017及以上版本支持的官方字符串聚合方法,行为稳定且符合预期。
Bug上报方式
可通过Microsoft官方的SQL Server反馈渠道提交该问题,比如在Microsoft Learn的SQL Server相关页面提交反馈,或通过Azure反馈门户(针对SQL Server产品)提交bug报告。
内容的提问来源于stack exchange,提问作者Alan Samet
相关产品推荐
相关产品推荐

