【问题标题】:How can I create a table with a dynamic name (based on current_date) and reference to it in INSERT statements?如何创建具有动态名称(基于 current_date)的表并在 INSERT 语句中引用它?
【发布时间】:2019-04-17 06:52:48
【问题描述】:

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

不必手动设置名称(使用 ctrl + h),我希望这可以自动完成。我的目标是我可以打开 SQL 并运行创建的表为 MyTable_YYYYMM 的查询。

注意:最终我想让 SQL 每月自动运行,但现在这是我理解的一个很好的第一步。

我做了下面的存储过程。问题是如果我想做一个alter table 或insert into 语句,我不能(或不知道如何)引用创建的表。

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')

我应该使用存储过程还是使用用户定义函数?

如果我可以简单地引用一些函数,那将是理想的,例如: CREATE TABLE DB.My_UDF(<My_DB>, <My_Table_Name>)

您能帮我提供一个代码示例吗?

【问题讨论】:

  • 您是否考虑过只生成未来的表格,然后再选择您想要的表格?
  • 我不明白这将如何解决问题。无论哪种方式,SQL 都需要重新运行,因此表是最新的。我想要的是表名是根据今天的日期创建的。
  • 如果你已经创建了表,你可以查询 sys.tables 找到你需要的,然后插入。
  • 你的意思是没有数据的表?还是用数据?问题是,如果我现在用所有数据填充表格,它将在 1、2 等月的时间内过时。您能否提供一个代码示例来说明您的意思?
  • 您可能有充分的理由这样做,但正常的设计方法是 one 表,其中包含一个额外的日期列。除非你有充分的理由,否则你不应该这样做

标签: sql function stored-procedures teradata


【解决方案1】:

除了最初创建新表 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;

【讨论】:

  • 这是一个聪明的解决方案。因此,如果我理解正确,我将每月创建表MyDB.MyTable_000000,并在每个月的查询结束时将此表的名称更改为MyDB.MyTable_yyyymm。对吗?
  • @Anonymous:是的
  • 从 mytable_000000 复制到新表中是否更容易,因此您不必每次都重新创建旧表?
  • @Andrew:无论如何你都必须创建一个新表,然后将其重命名与插入/选择加删除:-)
猜你喜欢
  • 2019-12-18
  • 2022-11-15
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多