我有此代码:
%global nb_usag;
%global usager_entr;
%let nb_usag=0;
%syslput nb_usag=&nb_usag;
%let usager_entr=u;
PROC SQL noprint ;
select count(distinct no_usager_entr) into :nb_usag from &lib..INSCRITS_USA_1
;
quit;
data _null_;
if &nb_usag > 0 then do;
call execute
("PROC SQL noprint ;
select distinct no_usager_entr INTO :usager_entr separated by ','
from &lib..INSCRITS_USA_1;")
;
if &usager_entr ne "u" then do;
call prxchange('s/,/","',-1,&usager_entr);
end;
end;
run;
%let usager_entr="&usager_entr";
%syslput usager_entr=&usager_entr;
%put &nb_usag;
%put &usager_entr;
但是代码为函数prxchange生成了此错误:
ERROR 135-185: Attempt to change the value of the constant 's/,/","' in the PRXCHANGE subroutine call.
我做错了什么?
我想用","在变量usager_entr中修改每个。
例如,如果usager_entr = 12121212,34343434,56565656
将成为12121212","34343434","56565656
。
在我的情况下,表& lib..inscrits_usa_1是空的,然后nb_usag = 0。
谢谢!
四处乱逛!而是直接从Proc SQL
假定列表将在以后的子句中使用constonct IN (&myList)
。
%let usager_entr_dq_csv_list = "redundant safety value that will never match anything";
PROC SQL noprint ;
select distinct quote(trim(no_usager_entr))
INTO :usager_entr_dq_csv_list separated by ','
from &lib..INSCRITS_USA_1;
需要冗余值,因为如果它是空的,您以后会生成IN ()
并具有语法错误。
如果列表在通过SQL中使用,则需要使用QUOTE
函数的其他参数将值与单个报价绑定。
用于从usager_entr = 12121212,343434,56565656到" 12121212"," 3434343434"," 34343434"," 56565656",您可以使用prxchange:
%let usager_entr =12121212,34343434,56565656;
%put &usager_entr;
%let New_usager_entr=%sysfunc(prxchange(s/([1-9]+)/"$1"/, -1,%quote(&usager_entr)));
%put &New_usager_entr;