【问题标题】:single quoting values using sql to create macro variable使用 sql 单引号值创建宏变量
【发布时间】:2013-08-21 19:54:25
【问题描述】:

我在 SAS 中使用宏来循环特定库中的数据表。我将元数据信息放在 data null 步骤中,并与 where 语句和我的宏变量进行比较。

我的 SQL 步骤如下所示:

proc sql;
  select quote(trim(code)) into :procedures separated by ', ' from procedures;
quit;

code 的某些值包含“45.10”和“G0102”等值,因此不能强制转换为数字。宏包含以下行:

%macro filter_codes(indata, outdata);
  data &outdata;
     set &indata(where = (code in (&procedures)));
  run;
%mend;

但是当使用“quote”函数进行双引号时,十进制值会产生问题。

我可以用单引号分隔值吗?

编辑:问题是由于 filter_codes 宏在调用执行步骤中运行(在一系列数据集上)并且在双引号内的宏变量中解析的双引号将结束调用执行。

【问题讨论】:

  • 您的代码没有明显的错误,除非您的值本身包含引号。 SAS 使用 '" 的方式肯定没有什么不同,除了宏变量分辨率,这与你的问题在这里似乎无关。我这边的一个简单测试证明它可以正常工作,使用来自sashelp.classheight。你能发布一些显示这不起作用的示例数据吗?
  • 你是对的,这导致错误的原因是引用的文本在数据 null 步骤中的调用执行命令中被解析。我已经修改了问题。

标签: sas sas-macro


【解决方案1】:

试试这个:

proc sql;
  select catt("'", code, "'") into :procedures separated by ', ' from procedures;
quit;

同时修复 set 语句中的 where 选项:

set &indata(where=(code in (&procedures)));

【讨论】:

  • 解决方案相当明显,虽然不如“引用”命令优雅。我通过调用select "'" || code || "'" into ... 有效地做了同样的事情。
【解决方案2】:

一步一步使用 SQL 怎么样?

%macro filter_codes(indata, outdata); 过程 sql ; 创建表 &OUTDATA 为 从 &INDATA 中选择 * 其中代码(从过程中选择不同的代码); 放弃 ; %修补;

那就不用担心引用了。

【讨论】:

    【解决方案3】:

    在 9.3 中,您有第二个参数,使您可以在 quote() function 中使用单引号。

    proc sql noprint;
    select quote(trim(code),"'") into :procedures separated by ', ' from procedures;
    

    但是.. 我不喜欢这个函数,因为它用一个空格填充空字符变量(见下文)。

    data _null_;
      x=''; /* empty */
      y=quote(x,"'");
      put y=;  /* gives y=' ' */
    run;
    

    不幸的是,这是获得可靠引用(例如引用引号)的唯一“内置”方式(除了 proc 导出等)。

    【讨论】:

      【解决方案4】:

      修复引用变量的问题。听起来你正在尝试使用类似的东西

      call execute("set &indata(where=(code in (&procedures)))") ;
      

      首先不需要在 CALL EXECUTE 字符串中使用双引号。将 &procedures 推送到未解析的命令堆栈中。

      call execute('set &indata(where=(code in (&procedures)))') ;
      

      如果您确实想解析宏变量,请查看使用 %sysfunc(quote())。

      put %sysfunc(quote(The procedure list is &procedures));
      

      【讨论】:

        猜你喜欢
        • 2013-01-23
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-31
        相关资源
        最近更新 更多