如何通过单条SELECT语句从单列批量赋值多个SQL变量?
用单条SELECT语句为多个变量赋值的实现方法
现有数据表MyTable,执行以下SQL可获取最新3条BizDate数据:
select top 3 BizDate from MyTable order by BizDate desc
查询结果如下:
| BizDate |
|---|
| 20250523 |
| 20250522 |
| 20250521 |
目前采用多组Declare和Set语句为变量赋值的写法如下:
Declare @today Date Declare @T_1 Date -- 前一天 Declare @T_2 Date -- 前两天 Set @today = (select max(BizDate) from MyTable) Set @T_1 = (select max(BizDate) from MyTable where BizDate < @today) Set @T_2 = (select max(BizDate) from MyTable where BizDate < @T_1)
可以用单条SELECT语句完成多变量赋值,以下提供两种实现方式:
方式一:利用ROW_NUMBER()窗口函数标记行号,通过CASE赋值
DECLARE @today Date, @T_1 Date, @T_2 Date SELECT @today = CASE WHEN rn = 1 THEN BizDate END, @T_1 = CASE WHEN rn = 2 THEN BizDate END, @T_2 = CASE WHEN rn = 3 THEN BizDate END FROM ( SELECT BizDate, ROW_NUMBER() OVER(ORDER BY BizDate DESC) AS rn FROM MyTable ) t WHERE rn IN (1,2,3)
原理:子查询中给按BizDate倒序排列的记录标记行号,最新的日期行号为1,依次类推;外层SELECT通过CASE语句将对应行号的BizDate值分别赋给目标变量。
方式二:通过PIVOT将行转列后直接赋值
DECLARE @today Date, @T_1 Date, @T_2 Date SELECT @today = [1], @T_1 = [2], @T_2 = [3] FROM ( SELECT BizDate, ROW_NUMBER() OVER(ORDER BY BizDate DESC) AS rn FROM MyTable ORDER BY BizDate DESC OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY ) t PIVOT ( MAX(BizDate) FOR rn IN ([1],[2],[3]) ) p
原理:先筛选出最新3条记录并标记行号,再通过PIVOT将行数据转成列,最后直接将列值赋值给对应的变量,一次完成所有赋值操作。
这两种方式都只需要查询一次MyTable,相比原写法的多次查询,效率更高,也满足单条SELECT完成多变量赋值的需求。
内容的提问来源于stack exchange,提问作者oldpride
相关产品推荐
相关产品推荐

