You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Proc SQL中使用多个end as语句时出现语法错误

SAS宏Proc SQL语法错误排查

我用以下Proc SQL代码给以_val结尾的变量赋值并创建新变量,部分变量加_val后名称太长,所以尝试用DO循环和%if %then %else条件缩短名称,但运行时报错。

宏代码

%macro rn_do;
proc sql noprint;
    create table validate_select2 as
    select *
    %do a=1 %to &checkbox_select_n;
        %do b=1 %to %eval(&&variable_checkbox_select_max&a);
            ,case when &b=1 &&&variable_checkbox_select&a..&&b. in (select valid_values from response_options_scan where variable="&&variable_checkbox_select&a") then "&&variable_checkbox_select&a&&b valid value"
            when &b=1 &&&variable_checkbox_select&a..&&b.="" and (select requirement_status from response_options_select where variable="&&variable_checkbox_select&a") in ("All Records (Backend data)","All Records", "Required") then "&&variable_checkbox_select&a&&b invalid value: missing"
            when &b=1 &&&variable_checkbox_select&a..&&b.="" and (select requirement_status from response_options_select where variable="&&variable_checkbox_select&a") then "&&variable_checkbox_select&a&&b invalid value: missing"
            when &b=1 &&&variable_checkbox_select&a..&&b.="" then "&&variable_checkbox_select&a&&b valid value: missing"
            when &b ne 1 &&&variable_checkbox_select&a..&&b.="" then "&&variable_checkbox_select&a&&b valid value: missing"
            when &b ne 1 and strip(&&variable_checkbox_select&a..&&b.) in (select valid_values from response_options_scan where variable="&&variable_checkbox_select&a") then "&&variable_checkbox_select&a&&b valid value"
            else "&&variable_checkbox_select&a&&b invalid value"
            %do c=1 %to 3;
                %if &&variable_checkbox_select&a=child&c._coadministered_vaccine %then %do;
                    end as child&c._coadministered_vax&b._val format=$100.
                %end;
                %else %if &&variable_checkbox_select&a=coadministered_vaccine_other %then %do;
                    end as coadministered_vax_other&b._val format=$100.
                %end;
                %else %do;
                    end as &&variable_checkbox_select&a..&&b._val format=$100.
                %end;
            %end;
        %end;
    %end;
    from validate_select;
quit;
%mend rn_do;

%rn_do;

错误日志

NOTE: Line generated by the invoked macro "RN_DO".
 169               end as &&variable_checkbox_select&a..&&b._val format=$100.
                   ___
                   22
 NOTE 137-205: Line generated by the invoked macro "RN_DO".
 169               end as &&variable_checkbox_select&a..&&b._val format=$100.
                                                                ______
                                                                22
 ERROR 22-322: Syntax error, expecting one of the following: ',', AS, FROM.  

 ERROR 22-322: Syntax error, expecting one of the following: GROUP, HAVING, ORDER, WHERE.  

 NOTE: Line generated by the invoked macro "RN_DO".
 169               end as &&variable_checkbox_select&a..&&b._val format=$100.
                                                                ______
                                                                76
 ERROR 76-322: Syntax error, statement will be ignored.

错误原因分析

  • 多重循环导致END重复输出:内层%do c=1 %to 3循环会让单个CASE语句生成3个END as ...语句,违反SQL语法——一个CASE只能对应一个END闭合,重复的END会让SAS解析器混淆。
  • 变量名包含非法字符:&&variable_checkbox_select&a..&&b._val里的连续点号,会被解析为变量名的一部分,但SAS数据集变量名不允许包含点号,直接触发语法错误。

解决方案

1. 移除多余的%do c循环,改用单次条件分支

把循环替换为逐个判断的条件分支,确保每个CASE只输出一个END:

%macro rn_do;
proc sql noprint;
    create table validate_select2 as
    select *
    %do a=1 %to &checkbox_select_n;
        %do b=1 %to %eval(&&variable_checkbox_select_max&a);
            ,case when &b=1 &&&variable_checkbox_select&a..&&b. in (select valid_values from response_options_scan where variable="&&variable_checkbox_select&a") then "&&variable_checkbox_select&a&&b valid value"
            when &b=1 &&&variable_checkbox_select&a..&&b.="" and (select requirement_status from response_options_select where variable="&&variable_checkbox_select&a") in ("All Records (Backend data)","All Records", "Required") then "&&variable_checkbox_select&a&&b invalid value: missing"
            when &b=1 &&&variable_checkbox_select&a..&&b.="" and (select requirement_status from response_options_select where variable="&&variable_checkbox_select&a") then "&&variable_checkbox_select&a&&b invalid value: missing"
            when &b=1 &&&variable_checkbox_select&a..&&b.="" then "&&variable_checkbox_select&a&&b valid value: missing"
            when &b ne 1 &&&variable_checkbox_select&a..&&b.="" then "&&variable_checkbox_select&a&&b valid value: missing"
            when &b ne 1 and strip(&&variable_checkbox_select&a..&&b.) in (select valid_values from response_options_scan where variable="&&variable_checkbox_select&a") then "&&variable_checkbox_select&a&&b valid value"
            else "&&variable_checkbox_select&a&&b invalid value"
            %* 替换原循环为单个条件分支,避免重复输出END;
            %if &&variable_checkbox_select&a=child1_coadministered_vaccine %then %do;
                end as child1_coadministered_vax&b._val format=$100.
            %end;
            %else %if &&variable_checkbox_select&a=child2_coadministered_vaccine %then %do;
                end as child2_coadministered_vax&b._val format=$100.
            %end;
            %else %if &&variable_checkbox_select&a=child3_coadministered_vaccine %then %do;
                end as child3_coadministered_vax&b._val format=$100.
            %end;
            %else %if &&variable_checkbox_select&a=coadministered_vaccine_other %then %do;
                end as coadministered_vax_other&b._val format=$100.
            %end;
            %else %do;
                %* 修正变量名,用下划线替换点号;
                end as &&variable_checkbox_select&a._&&b._val format=$100.
            %end;
        %end;
    %end;
    from validate_select;
quit;
%mend rn_do;

%rn_do;

2. 优化变量命名规则

将变量名中的点号替换为下划线,确保生成的变量名符合SAS命名规范(仅允许字母、数字、下划线,且不能以数字开头)。

3. 可选:用宏函数批量简化变量名

如果需要处理更多长变量名,可使用%sysfunc(tranwrd)批量替换关键字:

%else %do;
    %let short_var = %sysfunc(tranwrd(&&variable_checkbox_select&a, coadministered_vaccine, coadministered_vax));
    end as &short_var._&&b._val format=$100.
%end;

内容的提问来源于stack exchange,提问作者mvanduym

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:08:11