%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>
答案 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
表示结尾。