在做sqlserver数据的迁移工作。表,视图,迁移都没问题了。
但是存储过程的迁移,碰到了问题。sqlserver存储过程中,大量使用了如下的临时表。
CREATEA table #t1
(
id bigint,
name varchar(20)
)
注意:不同的过程里面可能存在同名的临时表,但是同名临时表的字段结构在不同的过程里面其实是不同的。
迁移过来的存储过程,都要进行改造。可是我在DM这边的存储过程里面,不能直接定义临时表。存储过程定义临时表,DM直接报语法有问题:不支持的语句类型
。
CREATEA TEMPORARY table T1
(
id bigint,
name varchar(20)
)
这我要咋搞,我上网看了别人的介绍,要通过 execute IMMEDIATE 动态语句才能创建。关键我这样写以后,也给我报错啊:
create or REPLACE PROCEDURE test_p
as
begin
execute IMMEDIATE 'create TEMPORARY TABLE T1(id bigint,name varchar(20)) ON COMMIT PRESERVE ROWS';
SELECT * FROM T1; -- 无效的表或视图名[T1]
end;
查询也改成动态语句就不报错:
create or REPLACE PROCEDURE test_p
as
begin
execute IMMEDIATE 'create TEMPORARY TABLE T1(id bigint,name varchar(20)) ON COMMIT PRESERVE ROWS';
EXECUTE IMMEDIATE 'SELECT * FROM T1';
end;
一个存储过程里面很多地方引用了这个临时表啊,我难道要每条语句都改成动态语句?有没有方便的方法啊,各位大佬?
据我所知,DM存储过程与oracle的存储过程类似:不支持DDL语句,create、alter、drop、truncate等。SQL Server 没有这个限制。
DM中,我也是使用 execute immediate 来解决存储过程建表问题。
这个确实SQL Server方便,我也是大量的使用临时表,如果都是用动态sql解决,我要吐血了,现在不知道怎么改造比较好。
我也有同样的问题;
我现在用的记录,嵌套表。
能实现功能,但是不知道性能方面。因为我不会看执行计划啥的
我用的方法,就是事先把临时表创建好,结果就是多出一堆表,每次打开都看的难受。其实这些表,都是在存储过程内临时用一下就删除的,非要搞什么全局临时表!
可以联系以下项目组原厂的同事,申请支持了sqlserver局部临时表的版本