我试图使用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版本,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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。