簡體   English   中英

覆蓋/附加sas變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM