2017-08-24 4 views
2

Quelqu'un peut-il m'expliquer comment obtenir PROC SQL pour donner les résultats de ma fonction personnalisée la longueur que je spécifie dans la définition de la fonction? Datastep le fait bien, mais SQL me donne la longueur par défaut de 200 caractères.sql ne respecte pas ma fonction fcmp longueur

Voici code qui illustre le problème:

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 ; 

Mon journal sur c'est:

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

Comme vous pouvez le voir, le datastep m'a donné une longueur de 11 sur mes 'tes' variable, mais sql me donne 200.

Y at-il un moyen d'obtenir la longueur 11 lors de l'utilisation de SQL?

Répondre

2

Malheureusement, je ne pense pas. Le SQL et l'étape de données fonctionnent différemment à cet égard, d'autres fonctions intégrées présentent certaines des mêmes problématiques (CATS/CATX par exemple ont des valeurs par défaut différentes dans SQL que dans l'étape de données). Je pense que cela a à voir avec la façon dont la compilation fonctionne dans l'étape de données contre l'interprétation en SQL. Je crois avoir vu quelque chose qui spécifiait que c'était un comportement attendu, mais je n'arrive pas à le trouver maintenant; Si vous souhaitez plus de détails et personne d'autre ici ne peut le fournir, peut-être commencer une piste avec SAS support et voir ce qu'ils disent.

Vous pouvez régler directement dans SQL bien sûr:

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