2016-08-12 5 views
1

이것은 가짜 질문 일 수 있지만 예제를 찾을 수 없습니다. 그것의 문서로 예견 할 말합니다 있도록,이 코드 필드는 need_field가 tо 길이 (200)를 인하catx 매크로 함수가 필요합니다 - catx는 proc sql에서 200 자로 제한됩니다

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

: 사건은 다음과 같습니다

CATX 함수는 변수에 값을 반환하거나를 반환 값 에 임시 버퍼가 있습니다. CATX 기능 에서 반환되는 값은 다음과 길이있다 : WHERE 절을 제외하고는 DATA 단계에서 최대 32,767 자 •

SQL

WHERE 절과 PROC에서 최대 200 자 •

CATX이 매크로 프로세서

에서 호출 할 때 최대 65,534 자 •

내가 사용 데이터 단계를 수행하지 않습니다. 매크로 프로세서를 사용하여 코드를 작성하도록 도와 주시겠습니까? (세 번째 방법). 고맙습니다!

답변

6

length=이 지정되어 있지만 모든 데이터 열을에 맞게해야하는 경우 catx 200 개 이상의 문자를 반환 할 것으로 보인다. 그렇지 않으면 빈 값을 얻게됩니다.

증명 : CATX 임시 버퍼에 값을 반환하는 경우

의 버퍼의 길이가 호출 환경에 따라, 그리고 : 문서에서

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 처리 완료 후 버퍼 의 값이 잘릴 수 있습니다. 이 경우 SAS 은 잘림에 대한 메시지를 로그에 기록하지 않습니다.

  • 데이터 단계에서 빈 값으로 결과를 변경하고, PROC에서 : 변수 또는 버퍼의 길이 를 병합 한 결과를 포함하기에 충분하지 않은 경우, SAS는 다음을 수행 SQL

  • 는의 위치를 ​​보여줍니다 로그에 메모를 기록하는 결과가 잘린 또는 전화 환경

  • 에 따라 빈 값으로 설정 중 하나라고 주장 로그에 경고 메시지를 기록 함수 호출 및 작동합니까 bobby1232 @
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; 

은 당신이 당신의 자신의 매크로 기능 %CATX를 만들 수 있습니다

+0

데이터 단계에서 1

  • 세트를 _ERROR_를 절단의 원인이되는 인자를 나열합니다! – Altons

  • +0

    예를 들어 내 대답을 편집했습니다 – Altons

    +0

    다른 collumn을 만들 필요가 없습니다. 내 답장을 확인해. – fl0r3k

    1

    도움이되기를 바랍니다. 매크로를 사용하면 코드를 생성 할 수 있습니다.이 경우 %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