SASがSAS構文を介してデータベースと通信している場合、クエリの一部を同等のDBMS言語に変換できます。これは暗黙的なパススルーと呼ばれます。クエリの残りの部分は、SASによって「後処理」され、最終結果が生成されます。SASのバージョン、DBMSベンダー、DBMSのバージョン、場合によっては接続/ libnameオプションに応じて、SAS構文のさまざまな部分がSASとDBMSの間で翻訳可能/互換性があると見なされるため、SASではなくDBMSによって実行されるように送信されます。
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;