sql-如何创建具有动态名称的表(基于current_date)并在INSERT语句中对其进行引用?

目前,我每个月都要重新运行数据选择查询,并在其中创建一个基表.该表的名称类似于MyDB.MyTable_Current_Date,因此对于今天,它将是使用YYYYMM日期格式的MyDB.MyTable_201811.

无需手动设置名称(使用ctrl h),我希望可以自动完成此操作.我的目标是可以打开SQL并运行查询,其中创建的表是MyTable_YYYYMM.

注意:最终,我还希望每个月自动运行SQL,但这对我来说是不错的第一步.

我做了下面的存储过程.问题是,如果我想做一个变更表或插入到语句中,我将无法(或不知道如何)引用已创建的表.

REPLACE PROCEDURE DB.table_yymm
(
IN      db_name VARCHAR(128), 
    tbl_name    VARCHAR(128)
    )
BEGIN
    DECLARE create_name VARCHAR(261) 
    ;   
    DECLARE sql_stmt    VARCHAR(600)
    ;

    SET create_name = db_name || '.' || tbl_name || CAST(
                                                    (CURRENT_DATE (FORMAT 'yymm'))
                                                    AS CHAR(4)
                                                    )
    ;
    SET sql_stmt = 'CREATE TABLE ' || create_name || ' (testvar char(1))' || ';' ;

    EXECUTE IMMEDIATE sql_stmt;         
END;

CALL prd_work_lm.table_yymm('My_DB', 'My_Table')

我应该使用存储过程还是使用用户定义的函数来执行此操作?

如果我可以简单地引用某些功能,例如:
创建表DB.My_UDF(< My_DB&gt ;,< My_Table_Name>)

您能否通过提供示例代码来帮助我?

最佳答案
无需最初创建新表MyDB.MyTable_201811并在整个脚本中使用它,您只需创建一个名称已知的表即可,例如MyDB.MyTable_000000.现在使用该名称并将其重命名为最后一步.

这是现有SP的细微变化,用于将表从’…_ 000000’重命名为’…_ yyyymmdd’:

REPLACE PROCEDURE rename_table_to_yyyymm
(
  IN db_name VARCHAR(128) CHARACTER SET Unicode,
  IN tbl_name VARCHAR(128) CHARACTER SET Unicode,
  OUT msg VARCHAR(600) CHARACTER SET Unicode
) SQL SECURITY INVOKER
BEGIN
   DECLARE old_name VARCHAR(261)  CHARACTER SET Unicode;
   DECLARE new_name VARCHAR(261)  CHARACTER SET Unicode;

   DECLARE sql_stmt VARCHAR(600)  CHARACTER SET Unicode;

   SET old_name  = '"' || Coalesce(NullIf(db_name,''), DATABASE) || '"."' 
                       || Coalesce(tbl_name, '') || '"';

   SET new_name  = '"' || Coalesce(NullIf(db_name,''),DATABASE) || '"."' 
                       || Trim(Trailing '0' FROM tbl_name)-- remove '000000' at the end of the table name
                       || '_' || To_Char(Current_Date, 'YYYYMM') || '"';

   SET sql_stmt = 'RENAME TABLE ' || old_name || ' AS ' || new_name || ';'; 

   EXECUTE IMMEDIATE sql_stmt;

   SET msg = ' Table ' || old_name || ' renamed to ' || new_name;

END;

转载注明原文:sql-如何创建具有动态名称的表(基于current_date)并在INSERT语句中对其进行引用? - 代码日志