2014-07-23 2 views
0

SQL 서버에서 테이블을 추출한 다음 Oracle 테이블에로드하는 SAS 작업을 수행하고 있습니다.SAS의 BLOB 필드가 잘 리면

SQL 서버에있는 필드 중 하나가 BLOB이며 1G만큼 클 수 있습니다. 오라클 테이블에서이 blob을 실행할 때 길이 경고가 표시되고 잘 리면 결과 파일이 손상됩니다.

SAS는 문자 변수가 최대 32K가 될 수 있지만 SAS는 최대 2G BLOB에 액세스 할 수 있다고 명시하고 있습니다.

어떻게 구현할 수 있습니까? 여기

proc sql; 
create view work.W2K3NU8 as 
    select 
    ID, 
    DNUMBER, 
    FILENAME, 
    FILE 
     format = $HEX2048. 
     informat = $HEX2048., 
    (input(compress(DATEENTERED),YYMMDD10.)) as DATEENTERED length = 8 
     format = date. 
     informat = date. 
     label = 'DATEENTERED', 
    (input(compress(DATEADDED),YYMMDD10.)) as DATEADDED length = 8 
     format = date. 
     informat = date. 
     label = 'DATEADDED', 
    (input(compress(DATECHANGED),YYMMDD10.)) as DATECHANGED length = 8 
     format = date. 
     informat = date. 
     label = 'DATECHANGED', 
    TYPE 
from &SYSLAST; 
quit; 

AND

 data trd.GAFILES 
      (dbnull = (
        ID = NO 
        DNUMBER = YES 
        FILENAME = YES 
        GA_FILE = YES 
        DATEENTERED = YES 
        DATAADDED = YES 
        DATECHANGED = YES 
        TYPE = YES 
        ETL_CREATE = YES 
        ETL_UPDATE = YES)); 
    attrib ID length = $255 
     format = $255. 
     informat = $255. 
     label = 'ID'; 
    attrib DNUMBER length = $10 
     format = $10. 
     informat = $10. 
     label = 'DNUMBER'; 
    attrib FILENAME length = $255 
     format = $255. 
     informat = $255. 
     label = 'FILENAME'; 
    attrib GA_FILE length = $4096 
     format = $HEX2048. 
     informat = $HEX2048. 
     label = 'GA_FILE'; 
    attrib DATEENTERED length = 8 
     format = DATETIME20. 
     informat = DATETIME20. 
     label = 'DATEENTERED'; 
    attrib DATAADDED length = 8 
     format = DATETIME20. 
     informat = DATETIME20. 
     label = 'DATAADDED'; 
    attrib DATECHANGED length = 8 
     format = DATETIME20. 
     informat = DATETIME20. 
     label = 'DATECHANGED'; 
    attrib TYPE length = $100 
     format = $100. 
     informat = $100. 
     label = 'TYPE'; 
    attrib ETL_CREATE length = 8 
     format = DATETIME20. 
     informat = DATETIME20. 
     label = 'ETL_CREATE'; 
    attrib ETL_UPDATE length = 8 
     format = DATETIME20. 
     informat = DATETIME20. 
     label = 'ETL_UPDATE'; 
    call missing(of _all_); 
    stop; 
    run; 
+0

이 질문을 속임수로 표시하고 싶지만 Joe가 약 4 년 전에는 더 포괄적 인 대답을 제공하지 못했기 때문에이 슬라이드를 풀어 보겠습니다 .-- 원본 원본 : http://stackoverflow.com/questions/2686291/large-character-field-sizes-sas 4 년 후에 우리는 여전히 같은 문제가 있다는 것을 슬프다. –

답변

2

SAS 데이터 세트가> 32,767 문자 사이즈를 지원하지 않는 데이터 단계이다. 나는 당신이 그것이 더 큰 것을지지한다는 것을 어디에서 보았는지 확신하지 못한다. DBMS의 다른 데이터 유형을 설명하는 액세스 참조를 읽었을 것입니다 (즉, DB2 섹션에서 BLOB 및 CLOB를 최대 2GB까지 허용하는 것으로 설명하지만 DB2가 지원하는 것은 SAS의 지원이 아니라고 설명합니다)).

SAS는 기꺼이 액세스 BLOB이지만, 32767을 넘지 않습니다. 청크로 읽거나 세션을 통과 할 때 DBMS 관련 언어를 사용해야합니다 (이를 건드리지 않고 전달해야합니다). 그래서 (해당 문자열 기능 및 연결 정보를 입력)처럼 당신은 덩어리로 읽을 수 있습니다 : 당신이 9.4이있는 경우

proc sql; 
connect to <>; 
create table SASTBL as 
    select * from connection to <> (
    select substring_Function(blobfield,1,32767) as blob_1, 
      substring_Function(blobfield,32768,32767) as blob_2, 
      substring_Function(blobfield,65535,32767) as blob_3, 
(... etc ...) 
    from your_tbl; 
); 
quit; 

, 당신은 또한 변환을 수행하는 FedSQL을 사용할 수 있습니다; 필자는 FedSQL에 익숙하지 않지만 SAS의 지원보다 많은 데이터 유형을 지원하는 것이 목적입니다. 그것은 BLOB를 지원할 수 있다고 명시 적으로 말하지 않습니다 (BLOB의 주석은 일관되게 '비슷한 데이터 유형으로 매핑됩니다. char 또는 varchar를 의미합니다). 그러나 9.4가 있으면 가치가있을 수 있습니다.

+0

FedSQL (http://support.sas.com/documentation/cdl/en/fedsqlref/66662/HTML/default/viewer.htm#p1uao2myrymg6bn1c5sd610r87cg.htm)는 DS2와 동일한 데이터 유형을 사용합니다 (http : // support. sas.com/documentation/cdl/en/ds2ref/66664/HTML/default/viewer.htm#n1kbwjygwr6m83n1ww4bajhcsy5l.htm). 두 페이지 모두 mamimum char 길이에 대해서는 꽤 모호합니다. 인코딩에 따라 다름을 나타내지 만, 어둠 속에서 다시 빠져 나갈 것이라는 느낌이 들었습니다. 그들이이 한계를 고치려고 마침내 행복 해지면 ... –

+0

여기 2G 한계를 보았습니다. http://support.sas.com/kb/41/575.html – PoX

+0

오른쪽 @PoX, 처음 32767 개의 문자에 액세스 할 수 있다고합니다. – Joe

관련 문제