通过宏变量块运行proc SQL

时间:2014-10-05 01:37:37

标签: variables macros sas proc-sql

我需要在Teradata DBMS中加入一个表Small with table Large。我选择small.A,B,C,D 4列为宏变量,但问题是变量会经常超过缓冲区大小。 所以,我用Google搜索了代码(http://support.sas.com/techsup/technote/ts553.html )下面就是按块运行SQL说每105条记录。现在我有两个问题: 1.行"文件临时;"似乎不适合我。错误是: 错误:访问/x/sas/config/Lev1/SASApp/temp.dat的授权不足。 2.该示例只有一列要加入,而我有4列A-D要加入。 有人可以帮帮我吗?感谢您的帮助!

%让chunk = 105;

 proc sql;
   create view uniq as
   select unique key
     from small
    order by key;

 data _null_;
   file temp;
   set uniq end=end;

 if _n_ = 1 then do;
   put "create table result as"
     / "  select key,data"
     / "  from connection to dbms"
     / " (select key,data"
     / " from large where key in("
     / key;
  end;
 else if mod(_n_, &chunk) = 0
   and not end then do;
   put "));" //;

   put "insert into result"
    / " select key, data"
    / " from connection to dbms"
    / "(select key,data"
    / "from large where key in("
    / key;

    end;

 else if end then do;
    put key "));" //;
    end;
 else put key ",";
 run;

 proc sql;
   connect to <DBMS> as dbms;
   %inc temp;

1 个答案:

答案 0 :(得分:1)

我认为SAS会在当前目录中查找名为temp的文件,并尝试写入该文件,除非您之前执行过一个文件名声明,告诉它'temp'实际上是其他地方的文件。我猜你在当前目录中有读访问权但没有写访问权(即在/ x / sas / config / Lev1 / SASApp中)。

在运行编写SQL的datastep之前尝试运行此操作,看看是否仍然出现相同的错误:

filename temp "%sysfunc(pathname(work))/temp.sas";

这将告诉SAS写入工作库中名为temp.sas的文件 - 你应该在那里有写访问权。

至于“加入多个列” - 你想做什么样的加入?来自小数据集键的所有4个变量A-D都是?你需要匹配所有这些吗?您是否确保Teradata表上存在所有这些变量的索引?

更新

将此作为具有多个连接条件的单个查询会更简单 - 我认为这是一个在测试确定了不可接受的低级别性能之后已经丢弃的选项吗?

如果我理解正确,只有当小表中的所有4个键在大表中匹配时才想加入。这仍然是可能的,但我不确定它在Teradata方面的表现如何。

您当前的代码一次处理您的小型数据集105条记录,使用where key in (row1value row2value ... row105value)行的where子句构造select和insert语句。使用这样的小记录集使Teradata更有可能使用索引,从而加快查询速度。您可以采取一种方法来获得一个4键连接,就是按照

的方式构造子句
where (key1 = row1value and key2 = row1value and key3 = row1value and key4 = row1value) 
or (key1 = row2value and key2 = row2value and key3 = row2value and key4 = row2value)
or ...
or (key1 = row105value and key2 = row105value and key3 = row105value and key4 = row105value)

但是,我不知道teradata在执行此类查询时是否会利用大型表上的索引,所以我建议您谨慎行事并对teradata如何使用索引进行一些研究。您可能会发现proc sql _tree和_method选项在确定是否正在使用索引时很有用。

在大型数据集中具有最高比例的不同值的关键字上进行初始左连接(从小数据集一次100行)可能更有意义(这将充分利用索引) ,然后使用where子句查找其他变量的匹配项。或者你可以在所有4个条件下进行左连接。使用这些方法中的任何一种,您都可以使用firstobs和obs选项将小数据集划分为适当的小块,而不是写出大量的where子句。