【发布时间】: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