2016-08-12 35 views
1

它可以是一個虛擬的問題,但我找不到示例。 的情況是如下:需要catx宏函數 - catx在proc中限制爲200個字符sql

proc sql; 
    create table set1 as select catx('<', field1, field2 ....) as need_field 
    from table; 
quit; 

有了這個代碼字段need_field切向上着tо長度200,因此它的predictible作爲文檔說:

的CATX函數返回一個值給變量,或返回一個值在 一個臨時緩衝區。對從CATX功能 返回的值具有以下長度:

•多達200個字符的WHERE子句和在PROC SQL

•在DATA步驟多達32767個字符除了在WHERE子句

•多達65534個字符時CATX從宏觀處理器

叫我不想做使用數據的一步。你能幫我用宏處理器構建代碼嗎? (第三種方式)。謝謝!

回答

6

看來,如果指定了length=但所有數據必須適合柱catx可以返回超過200個字符。否則你會得到空值。

證明:

data test; 
    length a b c $400; 
    a = repeat('A',300); 
    b = repeat('B',300); 
    c = repeat('C',300); 
    output; 
    a = repeat('A',350); 
    b = repeat('B',350); 
    c = repeat('C',350); 
    output; 
run; 

proc sql; 
    create table want as 
    select catx('<', a, b, c) as temp_list length=1000 
    from test; 
quit; 

data _null_; 
    set want; 
    a = length(temp_list); 
    put a=; 
run; 

在文檔也有這樣的:

如果CATX在臨時緩衝區中返回一個值,該 緩衝區的長度取決於調用環境,以及CATX完成處理後,可以截斷緩衝區中的值 。在這種情況下,SAS 不會寫入關於日誌截斷的消息。如果 長度可變或緩衝的是沒有大到足以包含 級聯的結果,SAS執行以下操作:

  • 轉換結果在數據步驟空值,並且在PROC SQL

  • 寫入一條警告消息日誌,說明該結果是要麼 截斷或設置爲空值,取決於呼叫 環境

  • 寫了一張字條給顯示的位置日誌函數調用,並列出了導致截斷
  • _ERROR_ 1中數據步
0

有一個方便的技巧,你放下你的cats列並將其作爲計算列進一步調用。

請參閱使用sashelp.class

proc sql; 
    create table want(drop=temp_list) as 
    select catx('<', repeat(name,200),repeat(name,200)) as temp_list length=1024, 
     put((calculated temp_list),$400.) as need_field length=400 
    from sashelp.class 
    ; 
quit; 

例2這個例子:

data a; 
length a $1000; 
a = repeat("A", 1000); 
run; 

proc sql; 
create table b(drop=temp) as select catx('<', a, a) as temp length=2024, 
    (calculated temp) as b length=5000 from a; 
quit; 

希望它有助於

+0

@ bobby1232它的工作的說法! – Altons

+0

編輯我的答案帳戶爲您的示例 – Altons

+0

您不需要創建另一個列。檢查我的answear。 – fl0r3k

1

您可以創建自己的宏功能%CATX。 使用宏可以生成一個代碼,在這種情況下,使用%catx(<, name, sex, name)我生成的strip(name)||"<"||strip(sex)||"<"||strip(name)這是非常類似的事情由常規catx function完成。 宏與parmbuff選項採取所有的弓箭,並把它們放在一個宏變量,這是呼籲syspbuff

%macro catx/parmbuff; 
    %let comma = %eval(%index(&syspbuff., %str(,))+1); 
    %let separator=%scan(&syspbuff., 1, %str(%(%),)); 
    %let syspbuff=%substr(&syspbuff., &comma., %eval(%length(&syspbuff.)-&comma.)); 
    %let result = strip(%sysfunc(tranwrd(%bquote(&syspbuff.), %str(,), %str(%)||"&separator."||strip%()))); 
    &result. 
%mend catx; 

proc sql; 
    create table a as 
    select %catx(<, name, sex, name) as var 
    from class; 
quit; 
+0

這塊代碼將從它的工作原理的解釋中受益匪淺。 –

+1

我不知道爲什麼你會想要做這樣的事情,但無論如何,這在數字上失敗。 – Joe

+0

@Joe例如,如果catx真的只返回200個字符,那麼你必須寫'substr(field1)|| '<'|| substr(field2)|| '<'...'<'|| substr(fieldn)',或者使用這個宏爲你生成它。是的,它會在數字上失敗。它仍然可以調整爲數字或發送到%catx'put(數字,格式)'而不是數字。 – fl0r3k