如何替换yyyymmdd以选择表名称的最新月结束日期

2020-02-22 sql-server

我正在尝试创建一个自动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;

Answers

可以采取以下步骤。

  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映像,最新版本)

Related