首页 > 解决方案 > 如何替换 yyyymmdd 以选择表名称的最新月份结束日期

问题描述

我正在尝试创建一个自动 SQL 代理作业,该作业将每月运行一次,并在每次作业运行时将数据加载到带有月末日期的新表中。如何替换 yyyymmdd 以选择最新的月末日期

IF OBJECT_ID('DataMart.dbo.tablename_yyyymmdd') IS NOT NULL 
DROP Table DataMart.dbo.tablename_yyyymmdd
BEGIN
    PRINT 'Student Data load completed'
    SELECT *
    INTO DataMart.dbo.tablename_yyyymmdd
    FROM 
    ( SELECT * FROM [DataMart].[dbo].[stutable_yyyymmdd]
) T;END;

标签: sql-server

解决方案


可以采取以下步骤。

  1. convert()功能可以输出多种日期格式
  2. 随后,您的查询字符串可以通过连接构造并使用exec sp_executesql.

另请注意,这绝对不是自动化使用的最安全方式。还请考虑参考这篇文章以防止任意字符串执行。

/* 1. get yyyymmdd */
declare @s char(8) = convert(varchar, getdate(), 112);
print @s;

/* 2. build query and run */
declare @sql nvarchar(max);  -- sp_executesql expects nvarchar
set @sql = '    
    IF OBJECT_ID(''testdb.dbo.tablename_' + @s + ''') IS NOT NULL 
        DROP Table testdb.dbo.tablename_' + @s + ';

    BEGIN
        PRINT ''Student Data load completed''
        SELECT *
        INTO testdb.dbo.tablename_' + @s + '
        FROM 
        ( SELECT * FROM [testdb].[dbo].[stutable_' + @s + ']
    ) T;
    END;
';

print @sql;
exec sp_executesql @sql;

在 SQL Server 2017 上测试(linux docker 镜像,最新版本)


推荐阅读