覆盖/追加sas变量

时间:2017-11-20 09:45:16

标签: sql sas sas-macro

%let rows = "";

%macro test;

 proc sql noprint;
   select count(ID)
   into: sqlRows
   from mytbl;
 quit;

 %do i = 1 %to &sqlRows; * loop from 1 to sqlRows;

   proc sql noprint;
     select ID
     into: ColumnID
     from mytbl(firstobs= &i);
   quit;

   %if &rows eq "" %then %do
     %let rows = "<tr><td>&ColumnID</td></tr>";
   %end;

   %if &rows ne "" %then %do
     %let rows = "&rows<tr><td>&ColumnID</td></tr>";
   %end;

 %end;*End loop;

%mend;

%test;

%put &rows;

您好我想将mytbl的列ID数据的所有数据放入变量。

我创建了一个名为rows的变量,并在其中分配了空值。然后使用循环我逐个获取mytab的值并将它们保存在columnID变量中。如果rows变量为空,则只添加带有columnID数据的tr和td。如果rows变量不为空,则追加它。但它只给了我桌子的最后一条记录。

假设mytbl在ID列中有数据1,2和3

rows变量的数据应为

   <tr><td>1</td></tr><tr><td>2</td></tr><tr><td>3</td></tr>

但它只显示我最后一行的数据

<tr><td>3</td></tr>

2 个答案:

答案 0 :(得分:4)

你有一些不同的问题,从一些缺失的分号开始。更重要的是,您的代码比它需要的更复杂。您可以使用SELECT INTO在一个PROC SQL步骤中获得所需的内容,您不需要为每个记录单独的PROC SQL步骤。玩弄:

data have;
  do ID=1 to 3;
    output;
  end;
run;

proc sql noprint;
  select cats('<tr><td>',ID,'</td></tr>') 
    into :Rows
    separated by ""
  from have;
quit;

%put &rows;

答案 1 :(得分:3)

我认为你在SAS中严重误解了宏变量是什么,而不是常规变量。你不能确切地说出你最终会做些什么,但仍然如此。

首先,宏变量不带引号;如果它们包含它们,它们就会被视为常规字符。所以:

%let var = "";
%let var = "&var.123";
%put &=var.;

将返回

"""123"

因为它对引号并不是很了解(它们有点意识到它们,但它并没有像普通的SAS变量那样对待它们)。

其次,正如Quentin正确指出的那样,为什么你一直在使用SQL连续?这基本上与您使用SQL的原因相反。 SQL非常适合一次对整个数据集做一些事情,它一次只能在一行中变得非常可怕 - 这就是数据步骤的用途。

如果你真的想要一个SAS变量,或者你想一次处理一行,你应该只使用数据步骤:

data want;
  set mytbl end=eof;
  retain rows;  *do not need to initialize to missing, that is normal;
  length rows $32767;
  rows = cats(rows,"<tr><td>",ColID,"</td></tr>");
  if eof then output;
run;

如果您打算使用call execute,通常会这样做,例如,如果您计划使用某个包装器将put计划为HTML页面(例如,在存储过程中)要执行的代码,在if _n_=1表示开头,if eof表示结尾。