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
相关产品推荐
相关产品推荐

