You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:12:11