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

SQL Server如何将动态生成的日期格式字符串作为查询表名

SQL Server 动态日期表名查询实现方案

SQL Server 不支持在静态查询语句中直接将动态生成的字符串作为表名(标识符)使用,实现该需求需使用动态SQL,通过系统存储过程sp_executesql执行拼接完成的完整查询语句即可。

基础实现代码

针对查询ACCOUNTID、ACCOUNTNAME字段的场景,可直接使用以下语句:

DECLARE @TargetTable NVARCHAR(200)
DECLARE @RunSQL NVARCHAR(MAX)

-- 按命名规则生成当日对应的目标表名
SET @TargetTable = CONCAT(
    '[GL_', YEAR(GETDATE()), FORMAT(GETDATE(), 'MM'),
    '].[dbo].[GL_ACCOUNT_', CONVERT(CHAR(8), GETDATE(), 112), ']'
)

-- 拼接完整查询语句
SET @RunSQL = N'SELECT ACCOUNTID, ACCOUNTNAME FROM ' + @TargetTable

-- 执行查询返回结果
EXEC sp_executesql @RunSQL

注意事项

  • 优先选择sp_executesql而非EXEC(字符串)执行动态语句,前者原生支持参数化传参,可规避SQL注入风险,后续扩展查询条件也更便捷。
  • 若需增加筛选逻辑,不要直接将参数值拼接到SQL字符串中,通过sp_executesql的参数定义传入即可,参考示例:
DECLARE @TargetTable NVARCHAR(200)
DECLARE @RunSQL NVARCHAR(MAX)
DECLARE @QueryAccID INT = 10001 -- 示例:待查询的指定账户ID

SET @TargetTable = CONCAT(
    '[GL_', YEAR(GETDATE()), FORMAT(GETDATE(), 'MM'),
    '].[dbo].[GL_ACCOUNT_', CONVERT(CHAR(8), GETDATE(), 112), ']'
)

-- 查询语句中使用参数占位符,不直接拼接参数值
SET @RunSQL = N'
SELECT ACCOUNTID, ACCOUNTNAME 
FROM ' + @TargetTable + N'
WHERE ACCOUNTID = @InputAccID
'

-- 定义参数类型、传入参数值后执行
EXEC sp_executesql 
    @stmt = @RunSQL,
    @params = N'@InputAccID INT',
    @InputAccID = @QueryAccID
  • 该场景下表名按系统日期固定规则生成,无外部用户输入拼接逻辑,SQL注入风险极低,可直接使用上述写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:03:43