sql - 使用宏将值传递给查询时,是否可以在不存在值的情况下继续查询?

标签 sql oracle error-handling sas macros

我有一个查询,其中我要使用宏传递一长串变量。我还使用宏对不同的表运行相同的查询。运行宏后,我发现并不是所有的表都包含列出的所有变量。从技术上讲,这些表应该具有相同的列,但似乎某些表中缺少其中的一些。我的问题是...如果该值不存在,我可以让查询绕过该特定宏的“传入”值吗?例如,如果我有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/

相关文章:

sql - 记录 SQL 脚本错误

sql - 通过比较两个日期列来确定实际的 TAT(周转时间)

SQL Server 2016 : Turn multiple lines into columns with the different iterations

sql - PL/SQL 将一个字符串按 "+ "拆分并将其中的数字相加?

oracle - Oracle中BEFORE INSERT TRIGGER失败时会发生什么

django - 在Django中使用try除外进行错误处理

php - 错误检查或发布期间未保存PHP复选框值

matlab - Matlab中if语句中的值的误差幅度?

sql - 在多行的值之间进行选择

php - 将 SQL 数据插入 HTML 文本区域