[英]Overwriting/Appending sas variable
%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變量為空,則僅將tr和td與columnID數據相加。 如果rows變量不為空,則附加它。 但這只是給我表的最后一條記錄。
假設mytbl在ID列中有數據1,2和3
行變量的數據應為
<tr><td>1</td></tr><tr><td>2</td></tr><tr><td>3</td></tr>
但它只向我顯示最后一行的數據為
<tr><td>3</td></tr>
從一些缺少的分號開始,您遇到了一些其他問題。 更重要的是,您的代碼比所需的要復雜。 您可以使用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;
我認為您嚴重誤解了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頁面(例如,在存儲的proc中),例如if _n_=1
作為開始, if eof
作為結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.