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

如何声明SQL连接会话时长有效的变量?

会话周期内有效的SQL变量实现方案

针对你遇到的重复声明变量的问题,SQL Server提供几种会话级变量的实现方式,能让变量在整个连接会话中生效,无需重复声明或硬编码:

1. 用户定义会话上下文(SQL Server 2016及以上推荐)

支持键值对存储,仅当前会话可见,连接断开后自动失效,是最灵活的方案。

设置会话变量:

-- 初始化会话级日期变量
EXEC sp_set_session_context @key = N'StartDate', @value = '20220701';
EXEC sp_set_session_context @key = N'EndDate', @value = '20220707';

在查询中调用:

-- 直接读取并转换为日期类型使用
SELECT * FROM YourTable
WHERE OrderDate BETWEEN CONVERT(DATE, SESSION_CONTEXT(N'StartDate')) 
                    AND CONVERT(DATE, SESSION_CONTEXT(N'EndDate'));

2. CONTEXT_INFO(兼容旧版本SQL Server)

这是一个二进制类型的会话变量,最多存储128字节数据,适合简单场景。

设置变量:

-- 将两个日期用分隔符拼接后转为二进制存储
DECLARE @ContextData VARBINARY(128) = CONVERT(VARBINARY(128), '20220701|20220707');
SET CONTEXT_INFO @ContextData;

解析并使用:

DECLARE @StartDate DATE, @EndDate DATE;
SELECT 
    @StartDate = CONVERT(DATE, LEFT(CONVERT(VARCHAR(128), CONTEXT_INFO()), 8)),
    @EndDate = CONVERT(DATE, RIGHT(CONVERT(VARCHAR(128), CONTEXT_INFO()), 8));

SELECT * FROM YourTable
WHERE OrderDate BETWEEN @StartDate AND @EndDate;

3. 会话级临时表

创建以#开头的局部临时表,仅当前会话可见,可存储多组变量数据。

创建并初始化临时表:

CREATE TABLE #SessionVariables (
    VariableName VARCHAR(50) PRIMARY KEY,
    VariableValue DATE
);

INSERT INTO #SessionVariables VALUES
('StartDate', '20220701'),
('EndDate', '20220707');

查询时读取变量:

DECLARE @StartDate DATE, @EndDate DATE;
SELECT 
    @StartDate = VariableValue FROM #SessionVariables WHERE VariableName = 'StartDate',
    @EndDate = VariableValue FROM #SessionVariables WHERE VariableName = 'EndDate';

SELECT * FROM YourTable
WHERE OrderDate BETWEEN @StartDate AND @EndDate;

注:局部临时表会在会话结束时自动删除,无需手动清理。

内容的提问来源于stack exchange,提问作者Alec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:50:34