有人可以向我解释如何让PROC SQL将我自定义函数的结果赋予我在函数定义中指定的长度吗? Datastep做得很好,但SQL给我的默认长度为200个字符。
以下是演示此问题的代码:
proc fcmp outlib = work.funcs.funcs ;
* Note type/length specification ;
function testy(istr $) $11 ;
return ('bibbitybobb') ;
endsub ;
quit ;
options cmplib = work.funcs ;
data from_dstep ;
set sashelp.class ;
tes = testy(name) ;
run ;
proc sql ;
create table from_sql as
select *
, testy(name) as tes
from sashelp.class
;
describe table from_dstep ;
describe table from_sql ;
quit ;
我的登录是:
47 describe table from_dstep ;
NOTE: SQL table WORK.FROM_DSTEP was created like:
create table WORK.FROM_DSTEP( bufsize=65536 )
(
Name char(8),
Sex char(1),
Age num,
Height num,
Weight num,
tes char(11)
);
48 describe table from_sql ;
NOTE: SQL table WORK.FROM_SQL was created like:
create table WORK.FROM_SQL( bufsize=65536 )
(
Name char(8),
Sex char(1),
Age num,
Height num,
Weight num,
tes char(200)
);
正如你所看到的那样,datastep在我的测试中给了我11分的长度。变量,但是sql给了我200。
使用SQL时有没有办法获得长度11?
答案 0 :(得分:2)
不幸的是,我不这么认为。 SQL和数据步骤在这方面的工作方式不同,其他内置函数也存在一些相同的问题(例如,CATS / CATX在SQL中具有与数据步骤中不同的默认值)。我认为它与数据步骤中的编译如何与SQL中的解释有关。我相信我已经看到一些事情说明这是预期的行为,但我现在似乎无法找到它;如果你想要更多详细信息并且此处没有其他人可以提供它,也许可以使用https://github.com/newrelic/rpm/commit/ec8e2ee17dd6f5801b9bf1793b8be048d9a9242c开始跟踪,看看他们说了什么。
您当然可以直接在SQL中设置它:
proc sql ;
create table from_sql as
select *
, testy(name) as tes length 11
from sashelp.class
;
quit;