2014-12-04 1 views
1
proc sql; 
create index key on data (Date); 
<other statement>; 
quit; 

위의 구문을 사용하여 데이터 세트에 인덱스를 생성했습니다. 그러나 data이 이미 인덱싱 된 경우 오류를 반환하고 <other statement>을 실행하지 않습니다. 인덱스 key이 존재하는지 여부 (존재하지 않을 경우 생성 한 후 생성)마다 <other statement>이 실행될 때마다 매번 확인하는 방법은 무엇입니까? 당신이 <other statement> 다음 단순히 CREATE INDEX 후 다음 문을 넣어 상관없이 CREATE INDEX 문의 결과의 실행하려면인덱스가 존재하지 않으면 데이터 셋 인덱스하기

계속 실행

:

+0

제 마지막에이 오류를 재현 할 수 없습니다. SAS는 테이블에 여러 개의 인덱스를 만드는 것을 지원해야합니다. 단순 인덱스의 경우, 인덱스 이름은 열 이름과 동일해야합니다 (여기서 'Date'는 여기에'Date '가 있습니다). 그렇지 않으면 SAS가 오류를보고합니다. –

답변

4

이 질문은 두 부분으로 대답을 가지고

RESET EXEC; 

SAS 로그에서 알 수 있듯이 SQL 프로 시저에서 SAS 오류가 발생하면 다음과 같은 행이 출력됩니다.

NOTE: PROC SQL set option NOEXEC and... 

RESET EXEC; 다시 EXECNOEXEC 리버스 문을 계속 실행 PROC SQL을 알려줍니다. 조건부의 존재를 확인하려면 인덱스의 존재

확인

: 처음에 오류를 생산하지 않을 수 있도록

그러나,이 단계를 프로그래밍하는 가장 좋은 것입니다 인덱스를 사용하려면 DICTIONARY 테이블을 사용해야합니다.

PROC SQL NOPRINT; 
    SELECT COUNT(*) INTO :idx 
    FROM dictionary.indexes 
    WHERE 
    libname = 'WORK' 
    memname = 'DATA' 
    AND upcase(indxname) = 'KEY'; 
QUIT; 

이것은 인덱스가 존재한다면, 인덱스가 존재하지 않거나 1 (일)의 경우는 값 0을 취한다 매크로 &idx 변수를 설정한다.

  • LIBNAME - 데이터 세트 상주 (항상 CAPS)하는 라이브러리
  • Memname - 데이터 세트 이름
  • indxname (항상 만드는 방법에 관계없이, CAPS) - 인덱스의 이름을 (대문자 인덱스 생성 방법에 따라 UPCASE를 사용하여 대문자로 강제 변환)

그런 다음 SAS 매크로를 사용하여 &idx의 값을 기반으로 다음 문을 조건부로 실행할 수 있습니다.

1

인덱스를 제거하는 한 가지 방법은 FORCE로 정렬을 수행 한 다음 데이터 세트를 정렬하고 인덱스를 제거하는 것입니다.

proc sort data=<whatever> force; 
    by <whatever>; 
run; 

데이터 집합이 매우 큰 경우,이 최적이 아닐 수 있지만, 당신은 일반적으로 그것을 색인하기 전에 데이터 집합을 정렬해야합니다 이것은 일반적으로 비용이 많이 드는되지 않습니다.

관련 문제