限制的解决方法:无法在 Execute Immediate 语句内执行另一个 Execute Immediate 语句
Workaround for restriction: Another Execute Immediate statement cannot be executed inside an Execute Immediate statement
我知道 SAP ASE 有一个 restriction for nested execute commands。
由于以下代码显示错误:
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
这是我要解决的实际问题。也许有人可以想出更好的方法来处理它。
我有一个必须动态执行的存储过程名称列表,此逻辑在初始存储过程中实现。
这些动态 运行 存储过程中的每一个都可以包含对其他存储过程的调用。
这些内部存储过程反过来也可以有动态语句执行命令。
例如,其中一个过程接收 table 的名称,查询 table 的字段和数据类型,详细说明创建语句并创建 table 的副本结构和不同的名称(虚拟 table)。
由于限制,我不得不使用包装来自 java class 的存储过程来调用第一个存储过程。但是,我使用的 SAP 16 评估版有问题。根据 SAP 的说法,可从该页面下载的版本包含实施 java classes 的错误,这些错误已通过补丁纠正(无法免费下载)。
所以我正在评估实施此解决方案的其他选项。
如果您有类似的问题或对如何以不同的方式解决问题有任何想法,我将不胜感激。
根据你的问题 link 回复:execute
命令,execute
命令有两种不同的用途:
execute <stored_proc_name>
-- and
execute ( <string> )
碰巧 <stored_proc_name>
可以通过 @variable 实现,例如:
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 ...
而不是 运行 execute ( 'store_proc_name_as_a_string ...' )
?
我知道 SAP ASE 有一个 restriction for nested execute commands。
由于以下代码显示错误:
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
这是我要解决的实际问题。也许有人可以想出更好的方法来处理它。 我有一个必须动态执行的存储过程名称列表,此逻辑在初始存储过程中实现。
这些动态 运行 存储过程中的每一个都可以包含对其他存储过程的调用。 这些内部存储过程反过来也可以有动态语句执行命令。 例如,其中一个过程接收 table 的名称,查询 table 的字段和数据类型,详细说明创建语句并创建 table 的副本结构和不同的名称(虚拟 table)。
由于限制,我不得不使用包装来自 java class 的存储过程来调用第一个存储过程。但是,我使用的 SAP 16 评估版有问题。根据 SAP 的说法,可从该页面下载的版本包含实施 java classes 的错误,这些错误已通过补丁纠正(无法免费下载)。
所以我正在评估实施此解决方案的其他选项。
如果您有类似的问题或对如何以不同的方式解决问题有任何想法,我将不胜感激。
根据你的问题 link 回复:execute
命令,execute
命令有两种不同的用途:
execute <stored_proc_name>
-- and
execute ( <string> )
碰巧 <stored_proc_name>
可以通过 @variable 实现,例如:
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 ...
而不是 运行 execute ( 'store_proc_name_as_a_string ...' )
?