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

时间:2018-11-14 10:25:44

标签: sql function stored-procedures teradata

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

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

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

我进行了以下存储过程。问题是,如果我要执行alter tableinsert 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>)

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

1 个答案:

答案 0 :(得分:1)

与其最初创建新表select t.*, (case when min(invitationDate) over (partition by clientId order by invitationDate) = min(invitationDate) over (partition by clientId, projectId order by invitationDate) then 0 else 1 end) as InvitedForPreviousProject from @table t; 并在整个脚本中使用它,不如简单地创建一个具有已知名称的表,例如MyDB.MyTable_201811。现在,此名称已被使用并重命名为最后一步。

这是现有SP的细微变化,用于将表从MyDB.MyTable_000000重命名为'..._000000'

'..._yyyymmdd'
相关问题