2017-01-17 5 views
1

최근에 DB2를 사용하여 주로 SAS를 사용하여 액세스하는 가속기 (IDAA)를 얻었습니다.DB2 타임 스탬프를 사용하여 SAS에서 테이블 만들기

이렇게하면 네트워크 문제로 인해 행을 삽입하기 전에 먼저 표를 만드는 것이 필요합니다.

내 문제, 내가 선택 문을 사용하여 테이블을 만들 수 있지만이 매우 느리지 만, 여기에 내가 SAS의 형식이 DATETIME30.6

입니다 볼 수있는 올바른 타임 스탬프 형식의 테이블을 만드는

그러나 내가 좋아하는 뭔가를 시도하는 경우 : 제공

RSUBMIT prod_acc; 
Proc delete data=user.table1; run; %PUT &sqlxrc &sqlxmsg; 
proc sql inobs=MAX stimer feedback noerrorstop; 
connect to db2(ssid=server); 
create table user.table1 
(
      date datetime30.6 
      ,reference char(16) 
      ,transact char(20) 
      ,alias char(60) 
      ,amount decimal(15,2) 
      ,currency char(3) 
    ); 
%PUT &sqlxrc &sqlxmsg; 
quit; 
run; 

을 로그

(
15    date datetime30.6 
         ----------- 
         1   22 
           200 
WARNING 1-322: Assuming the symbol DATE was misspelled as datetime30. 

ERROR 22-322: Syntax error, expecting one of the following: a quoted string, 
       an integer constant,), ',', CHECK, DISTINCT, FORMAT, INFORMAT, LABEL, LEN, 
       LENGTH, NOT, PRIMARY, REFERENCES, TRANSCODE, UNIQUE, ^, ~. 

ERROR 200-322: The symbol is not recognized and will be ignored. 

내가 DB2에서 보면, 열이 SAS는하지 않는 유형의 timestmp을 가지고에 다음과 같은 유형으로 인식합니다.

(
31    date timestmp 
         -------- 
         22 
         76 
ERROR 22-322: Syntax error, expecting one of the following: CHAR, CHARACTER, DATE, DEC, 
       DECIMAL, DOUBLE, FLOAT, INT, INTEGER, NUM, NUMERIC, REAL, SMALLINT, VARCHAR. 

ERROR 76-322: Syntax error, statement will be ignored. 

인터넷 검색을 시도과 답변의 다른 버전을 많이 찾았지만, 내가 볼 수있는 것도이 관련이 없으며, 가장 가까운 뭔가에 대해 수동으로 포맷을 만드는,하지만 난 그렇게하는 방법을 알아낼 수 없습니다이었다 .

아이디어가 있으십니까?

+1

'USER'는 SAS에서 정의한 libref의 이름 또는 원격 DB2 데이터베이스의 데이터베이스/스키마 이름입니다. 작성한 구문은 SAS 코드이므로 USER가 libref라고 가정합니다. 원격 데이터베이스에 코드를 삽입하려면 PROC SQL 내부에서'execute' 문을 사용하십시오. – Tom

+0

사용자는 정보를 제공하지 않는 내 Windows 사용자입니다. D – user2656595

+0

사용자 이름을 libref로 사용하는 것은 8자를 초과 할 가능성이 높기 때문에 아마 잘 작동하지 않을 것입니다. – Tom

답변

0

당신은 할 수 없습니다

create table user.table1 
(
     "date" TIMESTAMP(6) 
     ,reference char(16) 
     ,transact char(20) 
     ,alias char(60) 
     ,amount decimal(15,2) 
     ,currency char(3) 
); 

? DB2에서 date은 예약어이므로 큰 따옴표로 묶는 것이 항상 안전하다는 것을 기억하십시오. 또는 dt 정도와 같이 열 이름에 예약어가 아닌 단어를 사용하십시오.

+0

좋은 조언이지만 코드는 DB2 구문을 사용하지 않고 SAS 구문 ('''은 의미가 없음)에 있습니다. – Joe

+0

날짜는 실제로 날짜로 불리지 않으며 예라고 예약어입니다. 하지만, 다음 구문 중 하나를 기대하는 구문 오류가 발생했습니다 ..... – user2656595

0

이들 두 줄 위화감있다 : 후자의 LIBNAME 엔진을 사용하여 테이블을 작성하면서

connect to db2(ssid=server); 
create table user.table1 

제가 통과 쿼리에 대한 접속을 생성한다. 이 경우 첫 번째 문장은 사용되지 않으므로 관련이 없습니다. 나중에 사용하고 예제에서 실수로 그대로 두지 않는 한 제거해야합니다.

libname 구문을 사용 했으므로 DB2 대신 SAS 구문을 사용해야합니다. column-definition 문서 페이지 아래에있는 create table 문에는 datetime 유형에 대한 지정이 없습니다. 대신 다음 중에서 선택할 수있는 목록이 있습니다.

  • CHARACTER | VARCHAR < (width)>은 너비가 열 너비 인 문자 열을 나타냅니다. 기본 열 너비는 8 자입니다.
  • INTEGER | SMALLINT는 정수 C 럼을 나타냄니다.
  • 10 진수 | 숫자 | FLOAT < (너비 <, ndec>)>은 열 너비가 width이고 너비가 10 진수 인 자리 인 부동 소수점 열을 나타냅니다.
  • REAL | DOUBLE PRECISION은 부동 소수점 열을 나타냅니다.
  • DATE는 날짜 열을 나타냅니다.

내가 (이 예상대로 작동 할 가능성이 가장 높은 의미) 날짜를 지정하는 것이 가장 찾을 방법은 날짜로 정의 할 format 인수를 사용하여 다음 date하지만 numeric를 사용하지 않는 것입니다.

proc sql; 
    create table table1 
    (  date num format=datetime30.6 
      ,reference char(16) 
      ,transact char(20) 
      ,alias char(60) 
      ,amount decimal(15,2) 
      ,currency char(3) 
    ); 
quit; 

그러나, 나는 당신의 최고의 선택은 테이블을 만들 통과를 사용하는 것입니다 제안, 그래서 당신은 DB2 구문을 사용할 수 있습니다 - 당신이하지 SAS 자체, 거기에 테이블을 생성하고 있기 때문이다.

1

SAS에서는 PROC SQL이 아닌 DATA 단계를 사용하여 테이블의 구조를 정의하는 것이 더 자연 스럽습니다. 당신의 libref 데이터베이스를 가리키는 경우

data userdb.table1; 
stop; 
length date 8 reference $16 transact $20 alias $60 amount 8 currency $3 ; 
format date datetime30.6 amount 15.2 ; 
run; 

다음은 외부 데이터베이스에 필드에 사용할 수있는 데이터 유형 SAS에게 DBTYPE= 데이터 세트 옵션을 사용할 수 있어야합니다. 적어도 Teradata에서 작동합니다. 이러한 데이터 집합 옵션은 PROC SQL 내에서도 작동해야합니다.

proc delete data=userdb.table1; run; 
data userdb.table1 
(dbtype= 
(date='timestamp' 
    reference='varchar(16)' 
    transact='varchar(20)' 
    alias='varchar(60)' 
    amount='decimal(15,2)' 
    currency='char(3)' 
) 
); 
stop; 
length date 8 reference $16 transact $20 alias $60 amount 8 currency $3 ; 
format date datetime30.6 amount 15.2 ; 
run; 
관련 문제