sas – 限制PROC SQL中的结果

前端之家收集整理的这篇文章主要介绍了sas – 限制PROC SQL中的结果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用PROC sql查询具有数亿条记录的DB2表.在开发阶段,我想在这些记录的任意小的子集上运行我的查询(例如,1000).我尝试使用INOBS来限制观察值,但我相信这个参数只是限制SAS正在处理的记录数.我希望SAS只从数据库获取任意数量的记录(然后处理它们).

如果我自己编写一个SQL查询,我只需使用SELECT * FROM x FETCH FIRST 1000 ROWS ONLY …(相当于sql Server中的SELECT TOP 1000 * FROM x).但是,PROC sql似乎没有这样的选项.拍摄记录需要很长时间.

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

我读过PROC sql使用ANSI sql,它没有行限制关键字的任何规范. SAS可能不希望将其sql语法转换为特定于供应商的关键字?有没有工作?

解决方法

当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;

猜你在找的MsSQL相关文章