考虑定义如下的两个不同的过程:
CREATE PROCEDURE sp.procedure_example1()
BEGIN
CREATE TEMP TABLE tmp_table_proc_1 (_id INT);
CREATE TEMP TABLE tmp_final (_id INT, txt_col STRING);
END;
CREATE PROCEDURE sp.procedure_example2()
BEGIN
CREATE TEMP TABLE tmp_table_proc_2 (_id INT);
CREATE TEMP TABLE tmp_final (_id INT, num_col NUMERIC);
END;
每个过程都有自己的一组指令,但为了简单起见,我们只考虑导致问题的部分:
tmp_final
的临时表(每种情况下 DDL 都不同)DROP
语句现在,我们需要在单个多语句查询中调用这两个过程,这会触发错误。发生这种情况是因为 BigQuery 尝试为其随机生成的数据集使用相同的名称创建临时表
tmp_final
两次(创建用于存储临时表 24 小时。您可以查看文档此处)
要复制错误,只需创建两个过程并在 BigQuery 控制台中运行以下语句:
CALL sp.procedure_example1();
CALL sp.procedure_example2();
如果这两个过程在不同的会话中执行,即在第一个过程完成后手动运行第二个过程,则不会发生此错误,因为用于存储临时表的数据集在会话之间发生变化。
我知道删除临时表是最小化存储成本的好主意,但考虑到这两个过程在公司内部都是规范的,并且不能轻易更改。
此外,临时表通常用于日志目的,因此在每个过程结束时删除它们不应该是我们的第一选择。
我的问题是:是否可以强制 BigQuery 在运行不同的过程时在不同的数据集中创建临时表?我尝试过使用交易,但这也不起作用。
任何帮助将不胜感激。预先感谢
您可以在会话中将临时表视为全局变量。因此,如果您可以/想要覆盖它,请使用
create or replace
语句。
如果要保留现有数据,可以测试表是否存在,如果表存在则执行追加(或合并),或者创建。
如果该表专用于该过程,作为局部变量,请为该表使用唯一的名称。