sql不尊重我的fcmp函数长度

时间:2017-08-24 21:36:31

标签: sas proc-sql fcmp

有人可以向我解释如何让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?

1 个答案:

答案 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;