从 SAS-EG 执行的 SAS 程序中的 SAS 触发器错误

hav*_*age 7 sas

如果不满足某个条件,我需要让 SAS 触发错误我曾尝试使用 abort return n、abort abend 等。语法等

它是一个 SAS 程序,只能在带有提示的交互模式下从 SAS-EG 运行

我的代码:

DATA _NULL_;
IF prxmatch("/^TBDLZL\d{4}_[A-Z]/",&tablename_in) eq 0 then do;
    put "error table name &tablename_in does not match";
    ABORT RETURN 15; 
END;

RUN;
Run Code Online (Sandbox Code Playgroud)

有什么建议 ?

Ale*_*ida 5

您可以尝试使用:

put 'ERROR:' '/*customize error text here*/';
Run Code Online (Sandbox Code Playgroud)

如果要停止执行数据步骤,可以使用stop语句,例如:

DATA _NULL_;
   IF prxmatch("/^TBDLZL\d{4}_[A-Z]/",&tablename_in) eq 0 then do;
       put 'ERROR:' "table name &tablename_in" does not match;
       stop; 
   END;
RUN;
Run Code Online (Sandbox Code Playgroud)

如果您有宏并且想在宏执行步骤中获得错误消息,您可以使用%put

%put ERROR: /*customize error text here*/;
Run Code Online (Sandbox Code Playgroud)

谢谢@汤姆

请注意,将 ERROR( put ‘ERR’ ‘OR:’...)一词分成两部分的“技巧”仅在您对日志使用愚蠢的错误搜索时才需要。日志中的正常 SAS 错误消息始终出现在行首。例如,SAS/Studio 不会错误地标记包含 ERROR 的程序行,就好像它们是实际错误一样。

谢谢@MichaelKersten

多行注释、警告和错误的另一个巧妙技巧是将第二行和连续行的“:”替换为“-”。例子:

%put WARNING: first line of warning; 
%put WARNING- second line of warning;
Run Code Online (Sandbox Code Playgroud)

  • @Tom我个人使用这个技巧来进行“CTRL-F”样式查找,以在日志中搜索第一次出现的“ERROR:”。考虑到我使用的是 Base SAS IDE 或 SAS Studio,我永远无法选择将换行符作为搜索表达式的一部分。 (2认同)

Ric*_*ard 5

使用ABORT CANCEL语句。数据步骤将停止运行,并且不会处理提交代码中的以下步骤。

例如:

data _null_;
  set sashelp.class;
  if name = "John" then do;
    put 'ERR' 'OR: My error message';
    abort cancel;
  end;
run;

* This step is not done due to earlier ABORT CANCEL;
data _null_;
  set sashelp.class;
  where name like 'J%';
run;
Run Code Online (Sandbox Code Playgroud)

来自帮助:

CANCEL
导致已提交语句的执行被取消。操作取决于操作方法。

  • 批处理模式和非交互模式

    • 终止整个 SAS 程序和 SAS 系统。
    • 将错误消息写入 SAS 日志。
  • 窗口环境和交互线模式

    • 只清除当前提交的程序。
    • 不影响其他后续提交的程序。
    • 将错误写入 SAS 日志。
  • 工作区服务器和存储过程服务器

    • 只清除当前提交的程序。
    • 不影响其他后续提交调用。
    • 将错误消息写入 SAS 日志。
  • SAS IntrNet 应用服务器

    • 为每个请求创建一个单独的执行并提交请求代码。请求代码中的 CANCEL 参数会清除当前提交的代码,但不会终止执行或 SAS 会话。