我有一个查询,其中我要使用宏传递一长串变量。我还使用宏对不同的表运行相同的查询。运行宏后,我发现并不是所有的表都包含列出的所有变量。从技术上讲,这些表应该具有相同的列,但似乎某些表中缺少其中的一些。我的问题是...如果该值不存在,我可以让查询绕过该特定宏的“传入”值吗?例如,如果我有10个表,它们应该都具有相同的3个变量(model,make和year),但是其中一个表没有变量“make”,那么可以聪明地传递它并继续吗?因此,作为回顾,宏&&& PROV&FT包含一长串变量。当一个表不包含一个或多个这些变量时,我可以使用某种错误处理程序跳过它没有的一个吗?我可以使用GO选项吗?
我可以从宏列表中删除在所有表之间不通用的列,但最好不要这样做,因为大多数表都有它。
%macro NULCNT() / parmbuff;
%do i = 1 %to %sysfunc(countw(%bquote(&syspbuff.)));
%let ST = %scan(%bquote(&syspbuff.), &i.);
CREATE TABLE CHI_&ST._PRO_&FT AS
select *
from connection to oracle
(SELECT COUNT(*) AS TOT_TBL_CNT, &&&PROV&FT)
from DBSCHEMA.&ST._TBL_&FT A);
%end;
%mend NULCNT;
PROC SQL;
connect to oracle();
%NULCNT(&STATES);
disconnect from oracle;
QUIT;
我收到一个错误,该列在表之一中不存在。
最佳答案
如何获取每个表中的列的列表,然后与您的列表进行比较:
proc contents data = DBSCHEMA.&ST._TBL_&FT out = cols;
run;
proc sql;
select name into :cols separated by ' ' from work.cols;
quit;
这会将特定表中的列提供给宏变量cols。
然后,在循环中,您可以创建另一个列表,该列表仅包含您指定的&cols列,并将它们传递到PROC SQL中。本质上是&cols和&&&& PROV&FT之间的交集。
这可以通过以下代码完成:
%let this_cols =;
%let ii = 1;
/* Assuming &&&PROV&FT is comma separated based on the way you use it */
%do %while(%scan(&&&PROV&FT, &ii, %str(,)) ne %str());
%let this = %scan(&&&PROV&FT, &ii, %str(,));
%let found = %sysfunc(indexw(&cols, &this));
%if &found ne 0 %then %do;
%if (&this_cols ne %str()) %then %do;
%let this_cols = &this_cols.,&this;
%end;
%else %do;
%let this_cols = &this;
%end;
%end;
%let ii = %eval(&ii + 1);
%end;
现在,您可以在SQL语句中使用&this_cols而不是&&& PROV&FT。
关于sql - 使用宏将值传递给查询时,是否可以在不存在值的情况下继续查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57226890/