如何判断Workspace/Stored Process Server上下文以实现代码条件执行
判断SAS Workspace Server与Stored Process Server的最优方案
我之前也踩过靠_metaperson这类自动变量判断服务器类型的坑——有时候这些变量会在非预期场景下存在,或者偶尔缺失,可靠性确实拉胯。既然你已经建立了元数据连接,我推荐两个更靠谱的方案,亲测好用:
方案1:从元数据查询服务器官方定义(最可靠)
既然已经连了元数据,直接查服务器的元数据属性是最稳妥的方式,因为这是SAS官方定义的服务器类型,不会有歧义。具体代码如下:
/* 获取当前服务器的元数据URI */ %let server_uri = ; data _null_; length uri $256; /* 通过服务器逻辑名称定位元数据对象 */ rc = metadata_getnobj("omsobj:SASServer?@Name='&sysservername'", 1, uri); call symputx('server_uri', uri); run; /* 查询服务器的类型属性 */ %let server_type = ; data _null_; length type $32; rc = metadata_getattr("&server_uri", "ServerType", type); call symputx('server_type', type); run; /* 根据类型分支执行代码 */ %if &server_type = SAS Workspace Server %then %do; /* 这里写Workspace Server专属代码 */ %put Running on SAS Workspace Server.; %end; %else %if &server_type = SAS Stored Process Server %then %do; /* 这里写Stored Process Server专属代码 */ %put Running on SAS Stored Process Server.; %end;
方案优势
&sysservername是SAS自动返回当前连接服务器的逻辑名称,不会出错;ServerType是元数据中服务器对象的固有属性,只能是官方定义的固定值,完全没有模糊空间。
方案2:检查STP专属系统宏变量(快速判断)
如果你不想走元数据查询的流程,可以检查Stored Process Server专属的宏变量——这些变量只有在STP执行时才会自动生成,Workspace Server会话里绝不会出现(除非有人手动瞎定义,概率极低)。比如:
%if %symexist(_STP_PROGRAM_NAME) %then %do; /* STP专属代码 */ %put Running on SAS Stored Process Server.; %end; %else %do; /* Workspace Server专属代码 */ %put Running on SAS Workspace Server.; %end;
常用的STP专属变量还有_STP_REQUEST_ID、_STP_USERNAME,你也可以用这些来做判断,效果一致。
总结
- 优先选方案1,绝对可靠,适合对准确性要求高的场景;
- 方案2适合快速判断,代码更简洁,但要注意极端情况(比如有人手动创建了
_STP_PROGRAM_NAME变量),如果担心的话,可以把两个方案结合起来做双重验证。
内容的提问来源于stack exchange,提问作者Allan Bowe
相关产品推荐
相关产品推荐

