如何声明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
相关产品推荐
相关产品推荐

