2017-08-24 35 views
2

任何人都可以向我解釋如何讓PROC SQL給我的自定義函數的結果,我在函數定義中指定的長度? Datastep沒有問題,但SQL給了我200個字符的默認長度。SQL不尊重我的fcmp函數長度

這裏是代碼,演示了這個問題:

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的長度對我的「TES」變量,但SQL給了我200.

有沒有辦法獲得長度11時使用SQL?

回答

2

不幸的是,我不這麼認爲。 SQL和數據步驟在這方面的工作方式不同,其他內置函數也存在一些相同的問題(例如,CATS/CATX在SQL中的缺省值比數據步驟中的缺省值要高)。我認爲這與數據步驟中的編譯工作與SQL中的解釋有關。我相信我已經看到了一些具體說明這是預期的行爲,但我現在似乎無法找到它;如果你想了解更多細節,而且這裏沒有其他人可以提供,可以從SAS support開始一個曲目,看看他們說了些什麼。

您可以直接設置它的SQL課程:

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