17

我正在尝试使用 PROC SQL 来查询具有数亿条记录的 DB2 表。在开发阶段,我想对这些记录的任意小子集(比如 1000)运行我的查询。我尝试使用 INOBS 来限制观察结果,但我相信这个参数只是限制了 SAS 正在处理的记录数。我希望 SAS 只从数据库中获取任意数量的记录(然后处理所有记录)。

如果我自己编写 SQL 查询,我会简单地使用SELECT * FROM x FETCH FIRST 1000 ROWS ONLY ...(相当于SELECT TOP 1000 * FROM xSQL Server 中的)。但是 PROC SQL 似乎没有这样的选项。获取记录需要很长时间。

问题:如何指示 SAS 任意限制从数据库返回的记录数。

我读过 PROC SQL 使用 ANSI SQL,它没有任何关于行限制关键字的规范。也许 SAS 不想努力将其 SQL 语法转换为特定于供应商的关键字?没有解决办法吗?

4

2 回答 2

30

您是否尝试过outobs在您的 中使用该选项proc sql

例如,

proc sql outobs=10; create table test
    as
    select * from schema.HUGE_TABLE
    order by n;
quit;

或者,您可以使用 SQL passthrough 来使用 DB2 语法 ( ) 编写查询FETCH FIRST 10 ROWS ONLY,尽管这需要您将所有数据存储在数据库中,至少是暂时的。

直通看起来像这样:

proc sql;
    connect to db2 (user=&userid. password=&userpw.  database=MY_DB);

    create table test as
    select * from connection to db2 (
        select * from schema.HUGE_TABLE
        order by n
        FETCH FIRST 10 ROWS ONLY
    );
quit;

它需要更多语法并且无法访问您的 sas 数据集,因此如果outobs适合您,我会推荐它。

于 2012-07-31T19:12:10.937 回答
8

当 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;
于 2012-07-31T19:46:03.493 回答