这可能是一个虚拟的问题,但我找不到例子。 案例如下:
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个字符
我不想使用数据步骤。你能帮我用宏处理器构建代码吗? (第三种方式)。谢谢!
答案 0 :(得分:6)
如果指定catx
但length=
所有数据必须符合列,则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;
希望有所帮助