2016-11-07 4 views
1

Моя цель довольно проста. Просто хочу дать некоторые значения наборам данных. Есть 2 шага. Во-первых, считываются значения в макропеременные. Во-вторых, передайте макропеременные в набор данных. Коды:Макро переменная не читается правильно

Сначала создайте макропеременные.

proc sql; 
select procdate, prim,side,orgnname,orgnid,OrgnStTe into :procdate, :prim, :side, :orgnname, :orgnid, :OrgnStTe from ours 
where objid=783125; 
quit; 

Этот шаг работает хорошо. Затем передайте значения.

data test; 
set m1; 
if id=184 then DO; 
objid=783125;procdate=&procdate.;prim=&prim.;side=&side.;orgnname=&orgnname.;orgnid=&orgnid.;OrgnStTe=&OrgnStTe.; 
END; 
run; 

Для этого шага ошибка относится к имени orgn. Не совсем уверен в ошибке. Я пробовал% bquote (& orgnname.) И% str (& orgnname.). Оба не работали.

ПРИМЕЧАНИЕ: Строка, генерируемая макропеременной "ORGNNAME". 1 КАЛЬВАРИЙ ДЖОН ДЖЕЙМС МЕМОРИАЛЬНАЯ БОЛЬНИЦА ---- ОШИБКА 388-185: Ожидание оператора арифметики.

ОШИБКА 76-322: Синтаксическая ошибка, инструкция будет проигнорирована.

ответ

2

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

ORGNNAME = "1 CALVARY JOHN JAMES MEMORIAL HOSPITAL"; 

Так, чтобы сделать это с макропеременными синтаксис будет выглядеть следующим образом:

ORGNNAME = "&ORGNAME"; 

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

data test; 
    set m1; 
    if id=184 then DO; 
    set ours (where=(objid=783125) keep=objid procdate prim side orgnname orgnid OrgnStTe); 
    end; 
run; 
Смежные вопросы