需要catx宏函数 - 在proc sql中catx限制为200个字符

时间:2016-08-12 11:53:35

标签: sas sas-macro proc-sql

这可能是一个虚拟的问题,但我找不到例子。 案例如下:

proc sql;
   create table set1 as select catx('<', field1, field2 ....) as need_field
   from table;
quit;

使用此代码字段,need_field会缩短200长度,因此文档中可预测的是:

  

CATX函数向变量返回一个值,或者返回一个值   临时缓冲区。从CATX函数返回的值   具有以下长度:

     

•WHERE子句和PROC SQL中最多200个字符

     

•除WHERE子句

外,DATA步骤中最多32767个字符      

•从宏处理器调用CATX时最多65534个字符

我不想使用数据步骤。你能帮我用宏处理器构建代码吗? (第三种方式)。谢谢!

3 个答案:

答案 0 :(得分:6)

如果指定catxlength=所有数据必须符合列,则data test; length a b c $400; a = repeat('A',300); b = repeat('B',300); c = repeat('C',300); output; a = repeat('A',350); b = repeat('B',350); c = repeat('C',350); output; run; proc sql; create table want as select catx('<', a, b, c) as temp_list length=1000 from test; quit; data _null_; set want; a = length(temp_list); put a=; run; 似乎可以返回超过200个字符。否则你将获得空值。

证明:

_ERROR_

在文档中还有:

  

如果CATX在临时缓冲区中返回一个值,则该长度为   缓冲区取决于调用环境和缓冲区中的值   可以在CATX完成处理后截断。在这种情况下,SAS   不会将有关截断的消息写入日志。如果   变量或缓冲区的长度不足以包含   连接的结果,SAS执行以下操作:

     
      
  • 在DATA步骤和PROC SQL中将结果更改为空白值

  •   
  • 向日志写入一条警告消息,指出结果是   截断或设置为空值,具体取决于调用   环境

  •   
  • 在日志中写入一条注释,显示函数调用的位置,并列出导致截断的参数
  •   
  • 在DATA步骤
  • 中将 amount $1900 $4444 $39 $0 设置为1   

答案 1 :(得分:1)

您可以创建自己的宏功能%CATX。 使用宏可以生成代码,在这种情况下使用%catx(<, name, sex, name)生成strip(name)||"<"||strip(sex)||"<"||strip(name),这与常规catx function非常类似。 带有parmbuff选项的宏将获取所有的基础并将它们放在一个名为syspbuff的宏变量中。

%macro catx / parmbuff;
    %let comma = %eval(%index(&syspbuff., %str(,))+1);
    %let separator=%scan(&syspbuff., 1, %str(%(%),));
    %let syspbuff=%substr(&syspbuff., &comma., %eval(%length(&syspbuff.)-&comma.));
    %let result = strip(%sysfunc(tranwrd(%bquote(&syspbuff.), %str(,), %str(%)||"&separator."||strip%())));
    &result. 
%mend catx;

proc sql;
    create table a as
    select %catx(<, name, sex, name) as var
    from class;
quit;

答案 2 :(得分:0)

有一个方便的技巧,您可以放弃cats列并将其作为计算列进一步调用。

使用sashelp.class

查看此示例
 proc sql;
  create table want(drop=temp_list) as
  select catx('<', repeat(name,200),repeat(name,200)) as temp_list length=1024,
      put((calculated temp_list),$400.) as need_field length=400
  from sashelp.class
  ;
quit;

示例2:

data a; 
length a $1000; 
a = repeat("A", 1000);
run;

proc sql; 
create table b(drop=temp) as select catx('<', a, a) as temp length=2024,
   (calculated temp) as b length=5000 from a; 
quit;

希望有所帮助