限制的解决方法:不能在Execute Immediate语句中执行另一个Execute Immediate语句



我理解SAP ASE对嵌套执行命令有限制。

因此下面的代码显示错误:

DROP PROCEDURE sp_proc1
CREATE PROCEDURE sp_proc1
AS
BEGIN
DECLARE @cmd VARCHAR(20)
SET @cmd = 'SELECT GETDATE()'
EXEC (@cmd) 
END
EXEC sp_proc1

DROP PROCEDURE sp_proc2
CREATE PROCEDURE sp_proc2
AS
BEGIN
DECLARE @cmd VARCHAR(20)
SET @cmd = 'sp_proc1'
EXEC (@cmd) 
END
EXEC sp_proc2

错误:

Another Execute Immediate statement cannot be executed inside an Execute Immediate statement., Error 11039, Procedure sp_proc1, Line 6

这是我想要解决的实际问题。也许有人能想出更好的办法。我有一个必须动态执行的存储过程名称列表,该逻辑在初始存储过程中实现。

每一个动态运行的存储过程都可以包含对其他存储过程的调用。这些内部存储过程反过来也可以具有动态语句执行命令。例如,其中一个过程接收表的名称,查询表的字段和数据类型,详细说明create语句并创建具有相同结构和不同名称的表的副本(虚拟表)。

由于这个限制,我不得不使用包装来自java类的调用的存储过程来调用第一个存储过程。但是,我使用的SAP 16的评估版本有问题。根据SAP的说法,可从页面下载的版本包含实现java类的错误,这些错误通过补丁(无法免费下载)进行纠正。

因此,我正在评估实现此解决方案的其他选项。

如果你有类似的问题,或者有什么不同的解决方法,我将非常感谢你的建议。

从您的问题中的链接:execute命令,execute命令有两种不同的用法:

execute <stored_proc_name>
-- and
execute ( <string> )

碰巧<stored_proc_name>可以通过@变量实现,例如:

declare @procname  varchar(255),
@arg1      varchar(30)
---------------
select  @procname = 'sp_help',
@arg1     = 'sysobjects'
print "########################### %1! %2!", @procname, @arg1
exec @procname @arg1
---------------
select  @procname = 'sybsystemprocs..sp_help',
@arg1     = 'sp_helpdb'
print "########################### %1! %2!", @procname, @arg1
exec @procname @arg1
go

由此产生:

########################### sp_help sysobjects
Name       Owner Object_type  Object_status Create_date         
---------- ----- ------------ ------------- ------------------- 
sysobjects dbo   system table  -- none --   Jan 23 2016  9:52AM 
(1 row affected)
Column_name  Type              Length Prec Scale Nulls Not_compressed
... snip ...
########################### sybsystemprocs..sp_help sp_helpdb
Name      Owner Object_type      Object_status Create_date         
--------- ----- ---------------- ------------- ------------------- 
sp_helpdb dbo   stored procedure  -- none --   Jul 17 2020 12:11PM 
(1 row affected)
Parameter_name Type    Length Prec Scale Param_order Mode 
-------------- ------- ------ ---- ----- ----------- ---- 
@dbname        varchar    255 NULL  NULL           1 in   
@order         varchar     20 NULL  NULL           2 in   
(return status = 0)

我不知道你的代码结构,但我想知道如果在你的顶级代码,而不是运行execute ( 'store_proc_name_as_a_string ...' ),你可以使用execute @store_proc_name ...?

最新更新