錯誤的直接原因是,VARNUM()
不接受變量名的列表,但是這是你使用的是什麼。 &VARNAME
是來自SQL查詢的變量名稱的列表。
另一個重要問題:SELECT ... INTO
未捕獲整個數據集名稱列表,因爲SEPARATED BY
指令僅適用於:varname
。
所以你的數據步驟並不是連接所有的數據集,只是第一個。您還需要將SEPARATED BY
添加到第一個宏變量中。
最重要的是,我不明白你在做什麼。如果您想知道庫中存在哪種格式的這種格式,那麼您已經擁有該格式,因爲SQL查詢列出了具有該格式的所有數據集和列。
所以我發佈了更正的PROC SQL代碼。你知道爲什麼你的VARNUM()
錯誤發生。也許你可以從那裏拿走它。
如果您明確說明您要完成的工作,我相信我們可以進一步提供幫助。
proc sql noprint;
select distinct catx(".",libname,memname), name into :list2 separated by " ", :varname separated by " "
from dictionary.columns
where libname = upcase("&lib2") and format =('YYMMDD10.');
quit;
[增加了2016年12月13日]
好吧,我猜,下面就做你想做的。你可以修改它來做其他事情。
有很多方法可以做到這一點,我只是挑了一個。在這種情況下,CALL EXECUTE()
只是作爲代碼生成器,儘管它也具有解析宏和宏變量的能力。如果您熟悉JavaScript,則與我使用它時類似於document.write()
。
從SQL字典中創建工作表似乎比較合理,而不是試圖使用宏列表。在大多數情況下,字典的大小不會成爲問題,特別是在僅選擇具有使用特定格式的變量的數據集時。
我假定您真正想要的是將值設置爲在各個數據集中丟失,因此此示例爲每個具有任何具有指定格式的變量的數據集生成一個DATA
步驟。如果您想永久保存它們,您可以將它們複製回原始庫。
%macro drop_check(lib2,format=YYMMDD10.);
proc sql noprint;
create table vars as
select distinct libname, memname, name as varname
from dictionary.columns
where libname = upcase("&lib2") and format="&format"
order by libname, memname;
quit;
data _null_;
set vars;
by libname memname;
if first.memname
then do;
call execute("data " || memname || ";");
call execute(" set " || strip(libname) || "." || strip(memname) || ";");
end;
call execute(varname || "=.;");
if last.memname
then call execute("run;");
run;
%MEND drop_check;
options mprint symbolgen;
%drop_check(sashelp,format=DATETIME.)
上面的調用,使用SASHELP庫和尋找DATETIME。格式,產生了以下結果。我確認變量已被設置爲丟失。
MPRINT(DROP_CHECK): proc sql noprint;
SYMBOLGEN: Macro variable LIB2 resolves to sashelp
SYMBOLGEN: Macro variable FORMAT resolves to DATETIME.
MPRINT(DROP_CHECK): create table vars as select distinct libname, memname, name as varname
from dictionary.columns where libname = upcase("sashelp") and format="DATETIME." order by
libname, memname;
NOTE: Table WORK.VARS created, with 6 rows and 3 columns.
MPRINT(DROP_CHECK): quit;
NOTE: PROCEDURE SQL used (Total process time):
real time 0.07 seconds
cpu time 0.07 seconds
MPRINT(DROP_CHECK): data _null_;
MPRINT(DROP_CHECK): set vars;
MPRINT(DROP_CHECK): by libname memname;
MPRINT(DROP_CHECK): if first.memname then do;
MPRINT(DROP_CHECK): call execute("data " || memname || ";");
MPRINT(DROP_CHECK): call execute(" set " || strip(libname) || "." || strip(memname) || ";");
MPRINT(DROP_CHECK): end;
MPRINT(DROP_CHECK): call execute(varname || "=.;");
MPRINT(DROP_CHECK): if last.memname then call execute("run;");
MPRINT(DROP_CHECK): run;
MPRINT(DROP_CHECK): data VCATALG ;
MPRINT(DROP_CHECK): set SASHELP.VCATALG;
MPRINT(DROP_CHECK): created =.;
MPRINT(DROP_CHECK): modified =.;
MPRINT(DROP_CHECK): run;
MPRINT(DROP_CHECK): data VEXTFL ;
MPRINT(DROP_CHECK): set SASHELP.VEXTFL;
MPRINT(DROP_CHECK): modate =.;
MPRINT(DROP_CHECK): run;
MPRINT(DROP_CHECK): data VSTYLE ;
MPRINT(DROP_CHECK): set SASHELP.VSTYLE;
MPRINT(DROP_CHECK): crdate =.;
MPRINT(DROP_CHECK): run;
MPRINT(DROP_CHECK): data VTABLE ;
MPRINT(DROP_CHECK): set SASHELP.VTABLE;
MPRINT(DROP_CHECK): crdate =.;
MPRINT(DROP_CHECK): modate =.;
MPRINT(DROP_CHECK): run;
NOTE: There were 6 observations read from the data set WORK.VARS.
NOTE: DATA statement used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds
NOTE: CALL EXECUTE generated line.
1 + data VCATALG ;
2 + set SASHELP.VCATALG;
3 + created =.;
4 + modified =.;
5 + run;
NOTE: There were 17212 observations read from the data set SASHELP.VCATALG.
NOTE: The data set WORK.VCATALG has 17212 observations and 10 variables.
NOTE: DATA statement used (Total process time):
real time 0.15 seconds
cpu time 0.14 seconds
6 + data VEXTFL ;
7 + set SASHELP.VEXTFL;
8 + modate =.;
9 + run;
NOTE: There were 21 observations read from the data set SASHELP.VEXTFL.
NOTE: The data set WORK.VEXTFL has 21 observations and 9 variables.
NOTE: DATA statement used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds
10 + data VSTYLE ;
11 + set SASHELP.VSTYLE;
12 + crdate =.;
13 + run;
NOTE: There were 54 observations read from the data set SASHELP.VSTYLE.
NOTE: The data set WORK.VSTYLE has 54 observations and 4 variables.
NOTE: DATA statement used (Total process time):
real time 0.17 seconds
cpu time 0.17 seconds
14 + data VTABLE ;
15 + set SASHELP.VTABLE;
16 + crdate =.;
17 + modate =.;
18 + run;
NOTE: There were 1188 observations read from the data set SASHELP.VTABLE.
NOTE: The data set WORK.VTABLE has 1188 observations and 41 variables.
NOTE: DATA statement used (Total process time):
real time 0.31 seconds
cpu time 0.29 seconds
[增加了2016年12月15日]
讓我們回到了OP和修改PROC SQL
一步一點點,我公司生產的東西,看起來像什麼,我想你問:
%macro drop_check2(lib2,dsn,format=YYMMDD10.);
proc sql noprint;
select distinct catx(".",libname,memname), name
into :dsns separated by " ", :varname separated by " "
from dictionary.columns
where libname = upcase("&lib2") and format="&format"
order by 1;
quit;
%if &sqlrc NE 0
%then %do;
%put PROC SQL returned a warning or error. Terminating macro.;
%goto mout;
%end;
%else %do;
%if &sqlobs LE 0
%then %do;
%put PROC SQL did not return any rows. Terminating macro.;
%goto mout;
%end;
%else %do;
%local olddsn curdsn curvbl i;
data &dsn.;
set
%let olddsn=;
%do i=1 %to &sqlobs;
%let curdsn=%scan(&dsns,&i,%str());
%let curvbl=%scan(&varname,&i,%str());
%if &curdsn NE &olddsn
%then %do;
%if &olddsn NE
%then %do;
)
%end;
%let olddsn=&curdsn.;
&curdsn (keep=&curvbl
%end;
%else %do;
&curvbl
%end;
%end;
);
%do i=1 %to &sqlobs;
%scan(&varname,&i,%str())=.;
%end;
run;
%end;
%end;
%mout:
%MEND drop_check2;
options mprint;
%drop_check2(sashelp,er2,format=DATETIME.)
這將產生以下數據的步驟:
MPRINT(DROP_CHECK2): data er2;
MPRINT(DROP_CHECK2): set SASHELP.VCATALG (keep=created modified) SASHELP.VEXTFL (keep=modate)
SASHELP.VSTYLE (keep=crdate) SASHELP.VTABLE (keep=crdate modate);
MPRINT(DROP_CHECK2): created=.;
MPRINT(DROP_CHECK2): modified=.;
MPRINT(DROP_CHECK2): modate=.;
MPRINT(DROP_CHECK2): crdate=.;
MPRINT(DROP_CHECK2): crdate=.;
MPRINT(DROP_CHECK2): modate=.;
MPRINT(DROP_CHECK2): run;
NOTE: There were 17212 observations read from the data set SASHELP.VCATALG.
NOTE: There were 14 observations read from the data set SASHELP.VEXTFL.
NOTE: There were 54 observations read from the data set SASHELP.VSTYLE.
NOTE: There were 1180 observations read from the data set SASHELP.VTABLE.
NOTE: The data set WORK.ER2 has 18460 observations and 4 variables.
您將看到outpu t數據集/表只包含4個變量/列,但每個輸入數據集/表中的每個觀察值都包含一行)。如果存在變數/在一個以上的輸入數據集/表上同一名稱的列,那麼那些被設定爲失蹤超過一次,但是這只是一個小的低效率。
更關鍵的是,如果一個重複的變量/列具有數據集/表中它出現在不同的屬性,則其從第一數據集/表的屬性。
由於沒有包含標識符或鍵的變量/列,因此也無法識別行,但這似乎是您要求的。
根據您的描述,我不知道爲什麼你正在嘗試使用VARNUM(),它返回的數據集定義變量的位置(PROC目錄顯示的變量個數)。你在找什麼?無論這些變量中的任何一個在其各自的集合中是否缺少值(並相應地設置「結果」)?在您的例子原樣,VARNUM()很可能失敗,因爲它希望有且只有一個變量名(和你提供的空間分隔的變量名稱列表)。 – ryounce