proc sql;
create index key on data (Date);
<other statement>;
quit;
我曾经使用上面的语法在数据集上创建索引。但是,如果已将data
编入索引,则会返回错误并且不会执行<other statement>
。无论索引<other statement>
是否存在(如果不存在,然后创建一个),如何确保每次执行key
?
答案 0 :(得分:4)
这个问题有两部分答案:
继续执行
如果您希望<other statement>
无论CREATE INDEX
语句的结果如何都要运行,那么只需在CREATE INDEX
后面添加以下语句:
RESET EXEC;
正如您在SAS日志中所注意到的那样,当SAS在SQL过程中遇到错误时,它会输出一行:
NOTE: PROC SQL set option NOEXEC and...
RESET EXEC;
告诉PROC SQL
将NOEXEC
转回EXEC
并继续执行语句。
但是,最好对步骤进行编程,以便首先不会产生错误:
检查是否存在索引
要有条件地检查是否存在索引,我们需要使用DICTIONARY
表。
PROC SQL NOPRINT;
SELECT COUNT(*) INTO :idx
FROM dictionary.indexes
WHERE
libname = 'WORK'
memname = 'DATA'
AND upcase(indxname) = 'KEY';
QUIT;
这将设置一个宏变量&idx
,如果索引不存在,它将取值0(零)或如果索引存在则取1(一)。
然后,您可以使用SAS宏根据&idx
的值有条件地执行以下语句。
答案 1 :(得分:1)
删除索引的一个技巧是您可以使用FORCE进行排序 - 然后对数据集进行排序,并删除任何索引。
proc sort data=<whatever> force;
by <whatever>;
run;
如果数据集非常大,这可能不是最佳的,但是因为您应该在对数据集进行排序之前对其进行排序,这通常并不昂贵。