使用 sas select into: 语句创建全局宏变量

问题描述 投票:0回答:3

我希望使用 select into: 在宏模块中创建全局变量。

%macro example();
   proc sql noprint;
      select x into:DDD from aaa;
   quit;
%mend;

问题是我想创建一个全局变量DDD,在这个例子中我们只能获取局部变量DDD。 谢谢。 韦恩。

macros sas proc-sql
3个回答
1
投票

我认为您无法控制 Proc SQL 中的范围。您可以在数据步骤中使用调用 symputx 来指定范围。

但是,通过 Proc SQL 在开放代码中创建的宏变量默认是全局的。在宏中它将是本地的。

如注释中所述,您还可以使用

显式地将宏变量声明为全局变量
 %global macro_variable_name;

0
投票

正如 @Reeza 指出的那样,您可以简单地使用

%global DDD;
语句指定您希望宏变量全局位于宏的开头。

只有一个焦点:

有时您可以从另一个宏中调用一个宏。 在这种情况下,您可以在外部宏中预先存在与本地相同的宏变量。 使用

%global
语句调用内部宏时,您可能会遇到错误,因为同一宏变量的全局和局部定义之间存在冲突 (
ERROR: Attempt to %GLOBAL a name (XXX) which exists in a local environment.
)。

在这种情况下,您可以:

  • 在外部宏中也将宏变量预定义为全局
  • 在外部宏中将宏变量预定义为
  • local(或者简单地给它一个带有 %let
    sql into:
    call symput
     的(非)值) 
    避免 %global
     语句在内宏中
取决于您的宏变量可见性要求。


0
投票
我知道这是一篇很旧的帖子。但如果有人仍在试图解决这个问题。具体来说,在我们不知道 sql 查询将产生多少宏变量的情况下,我们可以使用 %do 迭代循环 i=1 到 &sqlobs。然后在其中使用%global语句生成全局宏变量,然后将本地sql宏的值赋给它。其方法如下所示。我还将 sqlobs 本地宏分配给全局宏,这样,它也可以在全局范围内使用,以防万一。 %宏 DistinctVal(选项卡,列); 过程 SQL; 选择不同的列(&C) 进入:DVal1 - 来自 &tab; 辞职; %全局不同对象; %让distinctobs=&sqlobs; /

我们执行此步骤是将本地sqlobs值转换为全局distinctobs值/ %do i=1 %to &sqobs %by 1; %global DistinctVal&i; %let DistinctVal&i=&&Dval&i; %结尾; /我们执行此步骤将本地 Dval1-.... 值转换为全局 DistinctVal1-...值/ %修正不同值;

© www.soinside.com 2019 - 2024. All rights reserved.