如果索引不存在,则为数据集建立索引

时间:2014-12-04 03:41:18

标签: indexing sas

proc sql;
create index key on data (Date);
<other statement>;
quit;

我曾经使用上面的语法在数据集上创建索引。但是,如果已将data编入索引,则会返回错误并且不会执行<other statement>。无论索引<other statement>是否存在(如果不存在,然后创建一个),如何确保每次执行key

2 个答案:

答案 0 :(得分:4)

这个问题有两部分答案:

继续执行

如果您希望<other statement>无论CREATE INDEX语句的结果如何都要运行,那么只需在CREATE INDEX后面添加以下语句:

RESET EXEC;

正如您在SAS日志中所注意到的那样,当SAS在SQL过程中遇到错误时,它会输出一行:

NOTE: PROC SQL set option NOEXEC and...

RESET EXEC;告诉PROC SQLNOEXEC转回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(一)。

  • Libname - 数据集所在的库(始终为CAPS)
  • Memname - 数据集名称(始终为CAPS,无论其如何创建)
  • indxname - 索引的名称(根据索引的创建方式进行大小写,使用UPCASE强制为大写)

然后,您可以使用SAS宏根据&idx的值有条件地执行以下语句。

答案 1 :(得分:1)

删除索引的一个技巧是您可以使用FORCE进行排序 - 然后对数据集进行排序,并删除任何索引。

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

如果数据集非常大,这可能不是最佳的,但是因为您应该在对数据集进行排序之前对其进行排序,这通常并不昂贵。