Макропроцессор SAS используется для генерации текста, который затем передается в SAS для выполнения, как если бы это был исходный текст программы. Вы использовали макро функцию% SCAN () для генерации текста B в позиции, где SAS ожидал имя переменной. В сообщении об ошибке говорится, что не удалось найти переменную B, потому что вы попросили ее использовать переменную B.
Перед использованием макрокода для генерации программы убедитесь, что вы знаете, какую программу вы хотите сгенерировать. Поэтому, возможно, вы захотите сгенерировать оператор:
select * from Words where Letter like "B%" ;
, который найдет все наблюдения в СЛОВАХ, если переменная LETTER начинается с прописной буквы B.
Чтобы сгенерировать это из вашей макропеременной ( сбивая нас с толку и называя LETTER), вы можете использовать код, подобный следующему:
select * from Words where Letter like "%scan(&letter,2,%str(,))%" ;
Обратите внимание, что ваше примерное значение LETTER на самом деле не сгенерирует то, что вы хотите. Вместо этого if сгенерирует этот код:
select * from Words where Letter like " B%" ;
, который ищет значения, начинающиеся с пробела, а затем заглавные буквы B. Это потому, что вы указали пробел после запятой.
Это очень проще использовать разделитель, отличный от запятой, при помещении списка значений в макропеременную. Например, вы можете использовать символ |
.
%let list=A|B|C;
select * from Words where Letter like "%scan(&letter,2,|)%" ;