在SAS宏中为数据集添加固定值变量的问题求助
解决SAS宏中添加固定值变量的问题
咱们先梳理你代码里的几个关键问题,然后一步步修正:
1. PROC SQL语法错误
你的PROC SQL语句混用了CREATE TABLE...AS和INSERT INTO,这会直接导致语法报错。你要创建新表存储两个数据集的差集,正确写法应该是直接用CREATE TABLE...AS SELECT,不需要额外的INSERT INTO,同时别忘了用quit;结束PROC SQL过程:
proc SQL noprint; create table &new_data_set as SELECT num_mouvement FROM &data_set_detail_mouvement EXCEPT SELECT num_mouvement FROM &data_set_mouvement; quit;
2. 添加变量的核心问题
你当前的变量赋值代码有两个明显问题:
- 字符值未加引号:如果
&Nom_controle和&Partenaire是字符型值,直接写Nom_controle=&Nom_controle;会让SAS把宏变量解析后的内容当成变量名,而非字符串常量,这会触发“变量未定义”的错误。 - 不必要的循环:
%do i=1 %to 10;完全多余,执行一次就能给整个数据集添加变量,循环只会重复覆盖数据集,白白浪费资源。
修正后的添加变量代码如下:
data &new_data_set; set &new_data_set; * 给字符型变量赋值时加双引号,确保SAS识别为字符串常量; Nom_controle = "&Nom_controle"; Partenaire = "&Partenaire"; run;
3. 宏变量大小写一致性(可选但建议)
你定义宏变量时用的是%let Nom_controle=Presence_mouvement;,但赋值时用的是&Nom_Controle——虽然SAS宏变量名称不区分大小写,但为了代码可读性和避免潜在问题,建议保持大小写统一,全部写成&Nom_controle。
完整修正后的宏代码
把这些修正整合到你的宏里,最终代码如下:
%macro presence_mouvement (data_set_detail_mouvement, data_set_mouvement); %if %sysfunc(exist(&data_set_mouvement)) AND %sysfunc(exist(&data_set_detail_mouvement)) %then %do; *Check if my data set actually exist; %let suffix=_2; %let new_data_set=&data_set_detail_mouvement&suffix; *Create the name of the new data set I'm going to save the result of the next proc sql in; proc SQL noprint; *Proc to look for errors in a previous data set and print it in the new data set; create table &new_data_set as SELECT num_mouvement FROM &data_set_detail_mouvement EXCEPT SELECT num_mouvement FROM &data_set_mouvement; quit; %let Nom_controle=Presence_mouvement; *Creation of a new variable; %if %sysfunc(length(&data_set_detail_mouvement))=29 %then %do; *Creation of a second variable (value conditional to the size of a previous variable); %let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 3)); %end; %else %if %sysfunc(length(&data_set_detail_mouvement))=30 %then %do; %let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 4)); %end; %else %do; %let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 6)); %end; * 修正后的添加变量代码,去掉不必要的循环,添加引号; data &new_data_set; set &new_data_set; Nom_controle = "&Nom_controle"; Partenaire = "&Partenaire"; run; %end;*End of the actions to do in case the two data set in parameters exist; %else %do; *Actions to do in case the two data set in parameters don't exist; data _null_; file print; put #3 @10 "At least one of the data set does not exist"; run; %end; *This macro is aiming at pointing error in a previous data set, print them in a new data set and add two new variables/columns to this new data set (indicating their origin). The next set is going to be to merge this new data set to another one; %mend presence_mouvement; %presence_mouvement (sasuser.bgpi__detail_mouvement, sasuser.bgpi__mouvement);
额外建议
如果&Partenaire截取的内容可能包含特殊字符(比如空格、引号),可以用%quote函数包裹宏变量,避免解析错误:
Partenaire = "%quote(&Partenaire)";
内容的提问来源于stack exchange,提问作者videorama17
相关产品推荐
相关产品推荐

