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)
  );

Как видите, шаг данных дал мне длину 11 для моей переменной tes, но sql дает мне 200.

Есть ли способ получить длину 11 при использовании SQL?


person Roy Pardee    schedule 24.08.2017    source источник


Ответы (1)


К сожалению, я так не думаю. SQL и этап данных работают по-разному в этом отношении, другие встроенные функции имеют некоторые из тех же проблем (например, CATS / CATX имеют другие значения по умолчанию в SQL, чем на этапе данных). Я думаю, это связано с тем, как компиляция работает на этапе данных по сравнению с интерпретацией в SQL. Я полагаю, что видел кое-что, указывающее на то, что это ожидаемое поведение, но я не могу найти его прямо сейчас; если вам нужны более подробные сведения, и никто из присутствующих не может их предоставить, возможно, начните трек с поддержкой SAS и посмотрите что они говорят.

Конечно, вы можете напрямую установить его в SQL:

proc sql ;
  create table from_sql as
  select *
        , testy(name) as tes length 11
  from sashelp.class
  ;
quit;
person Joe    schedule 24.08.2017