2016-12-07 110 views
0

我得到以下警告 - >警告:參數2超出範圍

error of multiple tables can't be assigned '.'

下面是我的代碼,我試圖獲取從庫中某列變量,然後檢查是否變量值失蹤或沒有。但有上述錯誤。

有人請幫我找出原因嗎?

%macro drop_check(dsn1=,lib2=,dsn=); 
%local rc dsid result; 

proc sql noprint; 
    select distinct catx(".",libname,memname), name into :list2, :varname separated by " " 
    from dictionary.columns 
    where libname = upcase("&lib2") and format =('YYMMDD10.'); 
quit; 

%put &list2; 

data &dsn(keep=&varname); 
    set &list2; 
&varname=.; 
run; 
%MEND drop_check; 

%drop_check(dsn1=sample,lib2=grp,dsn=er2); 
+0

根據您的描述,我不知道爲什麼你正在嘗試使用VARNUM(),它返回的數據集定義變量的位置(PROC目錄顯示的變量個數)。你在找什麼?無論這些變量中的任何一個在其各自的集合中是否缺少值(並相應地設置「結果」)?在您的例子原樣,VARNUM()很可能失敗,因爲它希望有且只有一個變量名(和你提供的空間分隔的變量名稱列表)。 – ryounce

回答

0

錯誤的直接原因是,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個變量/列,但每個輸入數據集/表中的每個觀察值都包含一行)。如果存在變數/在一個以上的輸入數據集/表上同一名稱的列,那麼那些被設定爲失蹤超過一次,但是這只是一個小的低效率。

更關鍵的是,如果一個重複的變量/列具有數據集/表中它出現在不同的屬性,則其從第一數據集/表的屬性。

由於沒有包含標識符或鍵的變量/列,因此也無法識別行,但這似乎是您要求的。

+0

@ user7108488,我已經添加了什麼,我認爲是一個最基本的解決你的問題。 – vknowles

+0

@ user7108488,你需要給出一個更好的解釋。在你的問題了'DATA'語句創建包含一個數據集只** **具有給定的格式,所以你最終包含什麼,但缺失值數據集的變量。 – vknowles

+0

@ user7108488,請看看這是你在找什麼。 – vknowles