Как цитаты макросов SAS взаимодействуют с литералами формата? - PullRequest
3 голосов
/ 21 июня 2011

Локальное выполнение в чистом сеансе:

%let x = %str(put(age, best.));

proc sql;
    select &x from sashelp.class;
quit;

Это приводит к следующей ошибке:

1     put(age, best.)
               ----
               22
                ----
                76
ERROR 22-322: Syntax error, expecting one of the following: a format name, ?.

ERROR 76-322: Syntax error, statement will be ignored.

Но эта версия с "ручным разрешением" работает без примечаний, предупреждений или ошибок:

proc sql;
    select put(age, best.) from sashelp.class;
quit;

Может кто-нибудь точно объяснить, что% str () делает в этой программе, что вызывает проблему во время выполнения?Извиняюсь за расплывчатый вопрос, но я не уверен, каковы соответствующие взаимодействия;Я не могу выполнить репликацию с использованием эквивалентного синтаксиса шага данных, поэтому, возможно, задействованы особенности SQL в proc?

Ответы [ 5 ]

3 голосов
/ 21 июня 2011

Функция% str () маскирует строку символов во время компиляции макроса.Удалите функцию% str () в операторе let или добавьте функцию% unquote () в sql select, чтобы иметь правильное разрешение.

2 голосов
/ 22 июня 2011

Ответ на этот вопрос на runubmit.com :

Я собираюсь пометить этот ответ как правильный, поскольку он привел меня на эту страницу документации: http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#tw3514-unquote.htm - «В редких случаях маскирование текста с помощью функции макроса в кавычках изменяет способ, которым сканер слов выполняет токенизацию текста ... Сканер слов не использует его в качестве границы литерального токена во входном стеке».Откровенно говоря, звучит как ошибка, но если алгоритм токенизатора такой древний и пушистый, как я себе представляю, я бы тоже выдал за него причуду!

1 голос
/ 21 июня 2011

По некоторым причинам SAS не любит «лучших». формат.

т.е. когда я пытаюсь это сделать, ваш код работает

 %let x = %str(put(age, 8.));

????

1 голос
/ 21 июня 2011

Можете ли вы вместо этого использовать оператор форматирования?Например, это работает просто отлично.

%let x = %str( age format=best.);

proc sql;
    select &x. from sashelp.class;
quit;
0 голосов
/ 20 июля 2011

Если вы добавите это к своему коду

%put _user_ ;

, вы увидите, как & x цитируется% str, в журнале.Вот почему код sql proc не работает.Использование% Unquote в выделенной части инструкции proc sql позволит выполнить код.

http://www2.sas.com/proceedings/forum2007/152-2007.pdf

...