Sas 使用sql创建宏变量的单引号值

Sas 使用sql创建宏变量的单引号值,sas,sas-macro,Sas,Sas Macro,我使用SAS中的宏循环特定库中的数据表。我将元数据信息放在一个data null步骤中,并与where语句和我的宏变量进行比较 我的SQL步骤如下所示: proc sql; select quote(trim(code)) into :procedures separated by ', ' from procedures; quit; 代码的某些值包含45.10和G0102之类的值,因此不能强制为数字。宏包含以下行: %macro filter_codes(indata, outdata

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

我的SQL步骤如下所示:

proc sql;
  select quote(trim(code)) into :procedures separated by ', ' from procedures;
quit;
代码的某些值包含45.10和G0102之类的值,因此不能强制为数字。宏包含以下行:

%macro filter_codes(indata, outdata);
  data &outdata;
     set &indata(where = (code in (&procedures)));
  run;
%mend;
但使用quote函数双引号时,十进制值会产生问题

我可以用单引号分隔值吗

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

尝试以下操作:

proc sql;
  select catt("'", code, "'") into :procedures separated by ', ' from procedures;
quit;
还修复set语句中的where选项:

set &indata(where=(code in (&procedures)));
试试这个:

proc sql;
  select catt("'", code, "'") into :procedures separated by ', ' from procedures;
quit;
还修复set语句中的where选项:

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

使用SQL一步到位怎么样

%macro filter_codes(indata, outdata); proc sql ; create table &OUTDATA as select * from &INDATA where code in(select distinct code from procedures) ; quit ; %mend;
那么就不必担心引用了。

使用SQL一步到位怎么样

%macro filter_codes(indata, outdata); proc sql ; create table &OUTDATA as select * from &INDATA where code in(select distinct code from procedures) ; quit ; %mend;
那么就不必担心引用了。

在9.3中,您有第二个参数,可以在引用中使用单引号

然而。。我不喜欢这个函数,因为它用一个空格填充空字符变量,见下文

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

不幸的是,这是除proc导出或诸如此类的方法之外,唯一一种“内置”的方法来应用可靠的引用,例如引用引号。

在9.3中,您有第二个参数,允许您在引用中使用单引号

然而。。我不喜欢这个函数,因为它用一个空格填充空字符变量,见下文

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

不幸的是,这是唯一一种“内置”的方式,而不是proc导出或类似的方式来应用可靠的引用,例如引用引用引用。

修复引用变量的问题。听起来你好像想用

call execute("set &indata(where=(code in (&procedures)))") ;
首先,在调用执行字符串中不需要使用双引号。将&procedures推送到未解析的命令堆栈上

call execute('set &indata(where=(code in (&procedures)))') ;
如果确实要解析宏变量,请查看使用%sysfuncquote

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

修复引用变量的问题。听起来你好像想用

call execute("set &indata(where=(code in (&procedures)))") ;
首先,在调用执行字符串中不需要使用双引号。将&procedures推送到未解析的命令堆栈上

call execute('set &indata(where=(code in (&procedures)))') ;
如果确实要解析宏变量,请查看使用%sysfuncquote

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

代码没有明显的错误,除非值本身包含引号。SAS使用“from”的方式当然没有什么不同,除了宏变量解析,这与您的问题似乎不相关。在我这方面的一个简单测试证明它工作良好,使用sashelp.class的高度。您可以发布一些示例数据来说明这不起作用吗?您是正确的,这导致错误的原因是引用的文本是在数据null步骤中的调用执行命令中解析的。我已经修改了这个问题。你的代码没有明显的错误,除非你的值本身包含引号。SAS使用“from”的方式当然没有什么不同,除了宏变量解析,这与您的问题似乎不相关。在我这方面的一个简单测试证明它工作良好,使用sashelp.class的高度。您可以发布一些示例数据来说明这不起作用吗?您是正确的,这导致错误的原因是引用的文本是在数据null步骤中的调用执行命令中解析的。我已经修改了这个问题。解决方案是相当明显的,尽管没有quote命令那么优雅。我通过将select“| | code | | |”调用到…中,有效地完成了同样的事情。解决方案非常明显,尽管没有quote命令那么优雅。我通过将select“| | code | |”称为。。。。