Ответ 1
Когда SAS разговаривает с базой данных через синтаксис SAS, часть запроса может быть переведена на эквивалент языка СУБД - это называется неявным прохождением. Остальная часть запроса является "пост-обработанной" SAS для получения конечного результата. В зависимости от версии SAS, версии СУБД и версии СУБД, а в некоторых случаях даже некоторых параметров соединения /libname разные части синтаксиса SAS могут быть переводимыми/считаемыми совместимыми между SAS и СУБД и, таким образом, отправляться для выполнения СУБД вместо SAS.
С параметрами SAS SQL - INOBS и OUTOBS - я много работал с MS SQL и Oracle через разные версии SAS, но я не видел тех, кто когда-либо переводился в запросы типа 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;