我试图使用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;