Как устранить ошибку ключевого слова с помощью макроса SAS

Я запускаю этот макрос SQL в SAS.

%macro calc(table=,cut=,whereclause=);
proc sql;
&table
   select 
        &cut as type format = $40. length = 40
       ,dt
       ,count(prod_nbr) as stat
       ,sum(new) as new
       ,sum(old) as old
       ,sum(retired) as retired
       ,sum(replaced) as replaced
       ,sum(final) as final
       ,sum(redo) as redo

from work.product
where retail_flg = 1
&whereclause
group by 1,2;
quit;
%mend calc;

Я вызываю макрос около шестидесяти раз в программе, и он работает примерно в 80% случаев, когда я его вызываю. Но время от времени это будет генерировать эту ошибку:ERROR: All positional parameters must precede keyword parameters

Если я запускаю код в том же порядке, ошибка всегда отображается в одной строке. Но если я начну выполнять вызовы в разных порядках, ошибка в конечном итоге произойдет в кажущейся случайной строке кода, которая вызывает макрос. Вот пример одного из вызовов, на который он был пойман (после того, как таблица calc уже была создана):

%calc(table = insert into calc, cut = 'Product', whereclause = and brand = 'JNJ' and Prod_type = 'N' and index(prod_nm, 'NEW') > 0);

Меня особенно смущает ошибка, так как у меня нет никаких позиционных параметров в макросе. Я исследовал и выявлял проблемы синтаксических ошибок и других распространенных проблем, но не смог устранить ошибку.

1 ответ

Решение

Скорее всего, у вас где-то есть несбалансированные цитаты. Возможно, какое-то значение у вас, WHERECLAUSE, имеет несбалансированные кавычки. Я бы посмотрел на значение ДО того, которое генерирует сообщение об ошибке. Это также может быть результатом усечения кода. Например, если вы записываете сгенерированный код в файл, некоторое длинное значение WHERECLAUSE может быть усечено и привести к несбалансированным кавычкам.

Добавление некоторых дополнительных разрывов строк в вызовах макросов может упростить проверку на наличие ошибок, поскольку более короткие строки легче сканировать людям.

%calc
(table = insert into calc
,cut = 'Product'
,whereclause =
  and brand = 'JNJ' and Prod_type = 'N'
  and index(prod_nm, 'NEW') > 0
);
Другие вопросы по тегам