SQL Server中SELECT为变量批量赋值的原理疑问(PIVOT场景)
理解SQL中通过SELECT为变量拼接多行值的原理(PIVOT动态列场景)
核心疑问解答
你提到的“SELECT赋值变量仅取最后一行”是常规单值赋值的认知,但在这个场景中,SQL Server会逐行迭代更新变量,最终实现所有行值的拼接,关键就在那行代码的逻辑:
COALESCE(@Pivot_Column + ',', '') + QUOTENAME(Year)
逐行拆解执行逻辑
假设Employee表的去重Year值为2020、2021、2022,变量@Pivot_Column初始为NULL,执行过程如下:
- 第一行(Year=2020):
@Pivot_Column + ','结果为NULL(NULL与任何字符串拼接结果都是NULL)COALESCE会返回备选的空字符串''- 拼接
QUOTENAME(Year)生成[2020],此时@Pivot_Column = '[2020]'
- 第二行(Year=2021):
@Pivot_Column + ','结果为[2020],COALESCE直接返回该值- 拼接
[2021]后,@Pivot_Column = '[2020],[2021]'
- 第三行(Year=2022):
- 重复上述逻辑,最终
@Pivot_Column = '[2020],[2021],[2022]'
- 重复上述逻辑,最终
为什么能实现多行拼接?
SQL Server对SELECT @变量 = 表达式 FROM 数据集的处理规则是:遍历数据集的每一行,用当前行计算出的表达式结果更新变量,而不是直接取最后一行的值。这种隐式的迭代累加,就是实现多行值拼接的核心。
完整代码回顾
DECLARE @Pivot_Column [nvarchar](max); DECLARE @Query [nvarchar](max); /*Select Pivot Column*/ SELECT @Pivot_Column = COALESCE(@Pivot_Column + ',', '') + QUOTENAME(Year) FROM (SELECT DISTINCT [Year] FROM Employee) Tab /* Create dynamic query */ SELECT @Query = 'SELECT Name, ' + @Pivot_Column + 'FROM (SELECT Name, [Year], Sales FROM Employee) Tab1 PIVOT (SUM(Sales) FOR [Year] IN ('+@Pivot_Column+')) AS Tab2 ORDER BY Tab2.Name' /* Execute query */ EXEC sp_executesql @Query
这段代码最终生成的动态SQL会把所有年份作为透视列,实现按员工、年份汇总销售额的效果。
内容的提问来源于stack exchange,提问作者suriya g
相关产品推荐
相关产品推荐

