EasySQLMAIL新特性:使用@@RUNCMD在SQL命令中调用其它SQL命令

使用快速信息分发工具分发Excel表格记录

前言

1、@@RUNCMD命令的使用方法

2、使用@@RUNCMD时需要注意的问题

3、更快速地执行被@@RUNCMD调用的SQL命令

 

前言

为了便于在任务中循环执行某些SQL语句实现多行数据的处理,EasySQLMAIL 1.0.1212版本中提供了@@RUNCMD方法,通过使用@@RUNCMD方法可以在任务的一个SQL命令中循环调用其它SQL命令。

例如,可以在一个SQL命令”命令A”中使用如下语法为查询到的每行数据调用一次”命令B”:

select process_instance_id from t_u  #@@runcmd([命令B])#;

语句中的最后一个命令“@@runcmd([命令B])”表示为语句中的每一行查询结果调用一次“命令B“。调用时系统会将“命令A”的语句的查询结果逐行传递给被调用的命令,被调用的命令中可以用@@sqldata(字段名)”方法获得传入的字段的值。

1、@@RUNCMD命令的使用方法

您可以在SQL命令的语句中加入如下命令来调用RUNCMD命令:

#@@RUNCMD([要调用的命令名称])#

在任务运行时,系统会为SQL查询的每一行数据调用一次@@RUNCMD中指定的SQL命令。

2、使用@@RUNCMD时需要注意问题
(1) 被调用的命令的执行场景必须是“供其它命令调用”,且必须为命令设置一个“命令名称”。“命令名称”不区分大小写,在同一个任务中必须唯一。命令名称中不允许出现除下划线以外的其它符号,且不能以下划线开始。

被调用的命令的执行场景必须是"供其它命令调用"

(2) @@RUNCMD出现的位置:如果@@RUNCMD出现在SELECT语句中的分号(即语句结束符)前,则系统为SELECT语句的每一行查询结果执行一次@@RUNCMD方法;如果@@RUNCMD单独出现,则只运行一次被调用的命令且不会传递查询结果给被调用命令。
例如,下面的语句中的@@RUNCMD方法只会运行一次:

/*@@runcmd命令在select语句的分号后之后单独出现,只运行一次 命令B”,且不会传递查询结果给被调命令*/

select * from t_u;

#@@runcmd[命令B]# 

下面的语句中的@@RUNCMD方法会循环执行:

/*@@runcmd命令在select之中,系统会为每条查询结果循环调用 命令B”*/

select * from t_u #@@runcmd[命令B]#   ;

(3) 在SQL Server数据库的IF语句中使用@@RUNCMD时需要注意,@@RUNCMD需要与SELECT语句连用才能实现IF的条件为真时执行@@RUNCMD方法。例如,“当a=b时执行@@RUNCMD”的需求应该这样写:

IF a = b select 1 #@@runcmd([命令B])#;/*正确。条件成立时会运行一次@@RUNCMD命令*/

以下是错误的写法:

IF a = b #@@runcmd([读取审批实例详情])#;/*错误。任务运行时会因SQL语法错误而中止*/

(4) 一个SQL命令中可以出现多次@@RUNCMD调用,但每一条SQL语句中只允许出现一次@@RUNCMD调用。例如,可以为一个SQL命令中的多条语句分别调用不同的命令:

--以下是同一个SQL命令中的多条语句。可以在每条语句中出现一次@@runcmd调用

select * from t1 #@@runcmd([命令1])#;--语句1

select * from t2 #@@runcmd([命令2])#;--语句2

if t1 = 1 select 1 #@@runcmd([命令3])#;--语句3

下面的语句写法错误:

select * from t_u #@@runcmd([命令1])# #@@runcmd([命令2]);/*错误,一个语句中出现了多次@@RUNCMD调用*/

如果要在一个语句中调用多条命令,可以在@@RUNCMD中添加多个命令名,每个命令名之间用“,”(逗号)分隔,例如:

select * from t_u #@@runcmd([命令1,命令2,命令3])#;

(5) @@RUNCMD总是在所在的SQL语句执行后才开始运行。
例如,下面的写法中,@@RUMCMD仍然在SELECT语句运行之后才开始执行:

#@@runcmd([命令1])#  select * from t_u;

(6) 当@@RUNCMD出现在UPDATE、INSERT、DELETE等语句中时,由于语句不会返回结果集,因此@@RUNCMD不会被执行,任务日志中会有如下记录:

@@RUNCMD命令被忽略时的日志记录

(7) @@RUNCMD方法两端的”#”号是变量定界符,默认为”#”。当数据源是SQL Server数据库时,也可以将变量定界符设置为”${}”以免与SQL Server的临时表符号产生混淆。

设置SQL语句中的变量定界符

上述设置后,@@RUNCMD的写法应变更为

${@@RUNCMD([命令1])}

(8) 如果修改了被调用的命令的名称,或是停用或删除了被调用的命令,则需要同时修改用@@RUNCMD方法调用了此命令的其它SQL命令的语句,否则任务执行时会因找不到被调用的命令而失败。

(9) 循环调用命令时,默认情况下如果某一次调用失败,会中止整个任务。如果需要在某次调用失败时忽略错误继续执行任务,可以在被调用的命令的配置中选择“当语句执行出错时忽略错误并跳过此SQL命令,继续运行任务的其他SQL命令”选项。

“忽略错误并跳过此SQL命令,继续运行任务的其他SQL命令”选项

3更快速地执行被@@RUNCMD调用的SQL命令

为了让@@RUNCMD调用的SQL命令更快速地运行,EasySQLMAIL中提供了SQL命令快速运行模式。在使用@@RUNCMD调用SQL命令时,如果被调用的SQL命令符合以下条件,系统将自动使用“快速运行模式”来执行被调用的SQL命令:

(1) 被调用的SQL命令中只有一条SQL语句;
(2) 被调用的SQL命令的语句中的变量全部是“JDBC变量”格式。
例如通过@@RUNCMD命令调用下面的语句时,系统将自动使用“快速运行模式”执行被调用的SQL命令:

SQL命令中只包含了一个SQL语句,且参数全为JDBC变量的SQL命令

系统在执行此命令时将利用JDBC的批量运行功能来提高运行速度。在需要执行大量数据插入或更新(例如在数据源之间复制数据)的语句时,可以通过使用这种配置方法提高任务的运行速度。JDBC变量的使用方法参见“在SQL语句中使用JDBC变量”

相关文档:

EasySQLMAIL使用教程-在任务中使用变量

EasySQLMAIL新特性:在SQL语句中使用JDBC变量

文档最后更新时间:2022-03-04