当 SAS 通过 SAS 语法与数据库对话时,部分查询可以被翻译为等效的 DBMS 语言 - 这称为隐式传递。查询的其余部分由 SAS 进行“后处理”以产生最终结果。取决于 SAS 版本、DBMS 供应商和 DBMS 版本,在某些情况下甚至某些连接/libname 选项,SAS 语法的不同部分在 SAS 和 DBMS 之间是可翻译的/被认为是兼容的,因此发送到由 DBMS 而不是 SAS 执行。
使用 SAS SQL 选项 - INOBS 和 OUTOBS - 我通过不同版本的 SAS 使用 MS SQL 和 Oracle 进行了很多工作,但我还没有看到那些被翻译成 TOP xxx 类型的查询,所以这可能还不支持,虽然当查询只涉及 DMBS 数据(没有连接到 SAS 数据等)时,应该是相当可行的。
所以我认为你只剩下所谓的显式传递 - 特定的 SAS SQL 语法来连接到数据库。这种类型的查询如下所示:
proc sql;
connect to oracle as db1 (user=user1 pw=pasw1 path=DB1);
create table test_table as
select *
from connection to db1
( /* here we're in oracle */
select * from test.table1 where rownum <20
)
;
disconnect from db1;
quit;
在 SAS 9.3 中,可以简化语法 - 如果已经存在 LIBNAME 连接,您可以将其重用于显式传递:
LIBNAME ORALIB ORACLE user=...;
PROC SQL;
connect to oracle using ORALIB;
create table work.test_table as
select *
from connection to ORALIB (
....
使用 libname 连接时,请务必在加载数据库时使用 READBUFF(我通常设置 5000 左右)或 INSERTBUFF 选项(1000 或更多)。
要查看是否发生隐式传递,请设置 sastrace 选项:
option sastrace=',,,ds' sastraceloc=saslog nostsuffix;