2013-04-18 4 views
1

DB2 서버에 구성원 목록을 업로드하려고 할 때이 문제가 발생하여 문제를 설명하기위한 최소한의 예제를 작성했습니다.SAS에서 DB2 테이블을 작성하면 누락 된 값이 추가됨

로컬로 생성 된 데이터 테이블을 SAS 9.2에서 DB2 데이터웨어 하우스 (ODBC 드라이버에 연결하여 액세스)의 테이블에 조인하기 위해 동일한 로컬 테이블을 같은 서버에 배치했습니다.)이 주장을 담고있다. 이것의 주요 목적은 member_ID가 업로드 된 목록에 포함 된 클레임 목록을 필터링하는 것입니다.

로컬 데이터의 첫 번째 행에 누락 된 값이있는 경우 (경우에 따라 구성원이 식별 정보를 갖지 못할 수도 있음) 로컬 측의 데이터는 DB2로 업로드 될 때 누락되지 않은 값을 잃게됩니다 개요. 문제점을 강조하기 위해 중요하지 않은 정보가있는 장난감 예를 첨부했습니다.

PROC IMPORT OUT= WORK.druglist DATAFILE= "C:\Users\caden2\Desktop\druglist.xls" 
DBMS=EXCEL REPLACE; 
RANGE="'Tab 4# Asthma Meds$'"; 
RUN; 

DATA for_clinical; 
SET druglist(KEEP= Drug_Class Drug_Type Generic GPI); 
IF _N_ = 4 THEN DELETE; 
IF _N_ <= 10; 
IF _N_ = 1 THEN DO; 
    Drug_Class=''; 
    Drug_Type=''; 
    Generic=''; 
    END; 
RUN; 

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema autocommit=yes; 

PROC SQL; 
DROP TABLE clinic.caden_test; 
CREATE TABLE clinic.caden_test AS 
    SELECT * FROM for_clinical; 
QUIT; 

PROC IMPORT 및 데이터 단계는 필요한 형식으로 데이터를 가져 오는 것으로 문제가 없어야합니다. 임상 라이브러리는 내 자격 증명을 사용하여 데이터웨어 하우스에 대한 ODBC 연결을 통해 만들어집니다. 아래의 스크린 샷은 로컬 시스템과 임상 서버에 설정된 데이터의 전후를 보여줍니다 (첫 번째 행에 약간의 누락이 있음을 확인하십시오). 나는 기록을 게시하지 않았다. 무서운 것은 내 기록이 어떤 것이 잘못되었다는 징후가 없다는 것입니다. 이 DB2, SAS에 문제가 있거나 SAS 및 DB2의 조합

enter image description here

인가? 로컬에서 로컬로 또는 DB2에서 DB2로 문제를 복제 할 수 없습니다. 또한 제거 된 값은 항상 대각선 형태로 나타납니다. 더 넓은 데이터 (4 개 이상의 변수)에서는 임의의 행에서 시작하여 마지막 열에 도달 할 때까지 대각선 방향으로 오른쪽으로 진행합니다.

Viewtable이 엉망이 아닌 의견에서 BellevueBob의 우려를 해결하기 위해 임상 데이터에 PROC FREQ를 출력하여 실종 상태가 실제로 있음을 보여줍니다. enter image description here

BellevueBob의 답변은 누락 된 데이터가 문자이지만 같은 방식으로 데이터 테이블을 만들지 만 숫자 데이터를 사용하는 경우 작동합니다. 솔루션은 문자 데이터의 경우처럼 작동하지 않습니다.

+0

이것이 SAS, DB2 또는 PEBKAC의 버그인지 여부는 확실하지 않으므로 처음 두 항목에 태그를 추가했습니다. –

+0

질문을 수정하여 'clinic'에 사용 된 전체 SAS'libname' 문을 추가 할 수 있습니까? 또한 DB2 테이블 자체에 잘못된 컬럼 값이 있는지 확인하십시오. 'viewtable'은 악명 높게 까다 롭다. – BellevueBob

+0

귀하의 우려 사항을 강조하기 위해 설명을 업데이트했습니다. 내 사용자 이름, 암호, dsn 및 스키마를 검열했지만 구문은 꽤 바닐라 ODBC 선언입니다. SQL 호출은 "클리닉"이 원격 라이브러리 또는 로컬 라이브러리라는 표시를 제공하지 않습니다. –

답변

1

나는 일반적으로 내 자신의 질문에 대답하는 팬이 아니지만, 누군가가 우연히 만날 수있는 것으로 생각했습니다.

나는이 질문에 거의 동일한 문구로 SAS 기술 지원에 연락, 이것은 그들의 응답했다 :

이 다음 SAS 주에 설명 된 드라이버 버퍼링 문제처럼 보인다

:

http://support.sas.com/kb/38/214.html

insertbuff이 수정하는 경우 IBM Db2 ODBC 드라이버를 가져 오는 것이 좋습니다. 이것이 문제가 아니라면 알려주십시오.

원본 예제에서는 기존 libname 문에 추가 옵션을 추가하는 것만 큼 간단합니다. 대신

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema autocommit=yes; 

의 새로운 문이 수정은 숫자 및 문자 데이터를 모두 작동

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema insertbuff=1 autocommit=yes; 

될 것이다. 다행스럽게도 DB2에만 적용되는 것처럼 보이는 그런 경우의 문제입니다.

1

NULLCHAR=NO 데이터 세트 옵션을 사용해보십시오 :

PROC SQL; 
    DROP TABLE clinic.caden_test; 
    CREATE TABLE clinic.caden_test(NULLCHAR=NO) AS 
    SELECT * FROM for_clinical3; 
QUIT; 

여기 a SAS reference입니다.

저는 DB2를 사용하지 않았으며 ODBC를 통해 테이블을 만드는 방법을 알지 못합니다. 그러나 다른 유용한 데이터 세트 옵션, 특히 DBCREATE_TABLE_OPTSDBTYPE을 조사하여 테이블 인덱스와 열 유형을 명시 적으로 정의 할 수 있습니다.

편집 : OP 주석에 기초한 정답입니다.

NULLCHAR=NO 옵션은 값을 NULL로 설정하지 않고 누락 값을 삽입 할 때 SAS에 단일 공백 ​​문자를 보내도록 지시합니다. 이 방법이 효과적 일지는 몰라도 SAS 사용 메모가 필요할 것입니다.

+0

다시 열어야 할 수도 있지만 솔루션은 내 장난감 데이터 세트에서 작동합니다. 훨씬 더 크고 더 많은 실제 데이터 세트에서 실행하고 문제가 지속되는지 확인하려고합니다. 참고로 NULLCHAR = YES는 문제를 해결하지 못했습니다. 그러나 YES를 NO로 전환하면 문제가 해결됩니다. DB2 null char이 val로 처리되어야한다고 알려줌으로써 비어 있지 않은 필드의 삭제가 사라지게하는 이유에 대한 적절한 설명이 있습니까? 귀하의 솔루션은 마법과 구별 할 수 없습니다;). –

+0

필자는 추측하고 있지만 테이블 작성시 사용 된 DB2 컬럼 데이터 유형과 관련이 있으며 'NOT NULL' 속성이있는 경우 일 수 있습니다. 흔히 테이블 인덱스를 지정하지 않으면 첫 번째 열이 사용되며 기본적으로 'NOT NULL'로 설정 될 수 있습니다. SAS는 작은 따옴표를 문자 "누락 값"(NULL 개념이 없음)으로 사용하므로 NULLCHAR = NO를 사용하면 SAS가 행을 삽입 할 때 NULL 대신 단일 공백을 보내도록 지시합니다. 확인하려면 DB2에 다른 응용 프로그램으로 로그인하고 테이블에서 DDL을 검사하십시오. – BellevueBob

+0

열어주세요. 이 솔루션은 내 문자 데이터에서 작동하지만 숫자 데이터를 사용하여 문제가 해결되지 않았습니다 (NULLCHAR = YES 또는 NULLCHAR = NO는 작동하지 않음). –

관련 문제