在proc sql视图中,可以按照以下语法使用临时库定义:
libname viewlib 'SAS-data-library';
proc sql;
create view viewlib.emp_view as
select *
from mydblib.employees
using libname mydblib oracle user=smith password=secret
path='myoraclepath';
quit;
这种方法的一个有用的优点是它允许SAS / Access凭证(例如密码等)保持隐藏,并且也不会与现有的库定义冲突(例如,如果用户已经有'mydblib'libref,这个不取代该定义。)
但是,某些条件下SQL视图不合适 - 例如在尝试限制自动SQL传递或创建文本文件视图时。
我的问题是, - 使用临时libref(例如上面的SQL视图示例)创建数据步骤视图的最佳方法是什么? libref不应该与现有的librefs冲突,不应该在用户会话中持久存在,并且不应该允许密码等可见..
答案 0 :(得分:1)
您可以按路径直接引用文件,如果这是您要查找的内容。我不知道这是否对您的具体示例有帮助,因为我不知道这将适用于非SAS数据集,但是对于googlers来说这个答案可能是一个好主意,因为这是一个合理的答案。你的头衔问题。
例如:
libname ctest 'c:\temp';
data ctest.myview/view=ctest.myview;
set 'c:\AnotherLocation\class';
run;
示例数据:
data 'c:\AnotherLocation\class';
set sashelp.class;
run;
但是,这不适用于关系数据库。
就文本文件而言,虽然这不起作用,但您可以创建一个infile的视图;假设'c:\ temp \ dummy.txt'存在,其中包含一些文字:
data testvw/view=testvw;
infile "c:\temp\dummy.txt" lrecl=50 pad truncover;
input
@1 str $50.;
run;
跑,检查;然后添加一些文本行。然后重新打开视图 - 它将被更新。
答案 1 :(得分:1)
所以 - 这是可能的。最后到达那里!
%let templib=SomeLib4;
data myview /view=myview;
attrib var1 format=$32767. informat=$32767. label='blah'
var2 format=$32767. informat=$32767. label='blah'
var3 format=$32767. informat=$32767. label='blah';
call missing(of _all_); /* avoid initialisation log messages */
if libref("&templib")=0 then do;
put "WARNING: Library &templib already exists, terminating..";
stop; /* do not replace an existing libref */
end;
else __rc=libname("&templib",,'MYSQL',
"SERVER='blah.com' MYSQL_PORT=3306 DATABASE=blah
USER='blah' PASSWORD='xxx' "); /* Declare temporary libref */
__DSID=OPEN("&templib..MY_Dataset",'IS'); /* OPEN the data set */
CALL SET(__DSID); /* use CALL SET to get variable values */
__rc=FETCH(__DSID); /* FETCH the first observation */
DO WHILE (__rc=0); /* while the last FETCH retrieved an obs */
OUTPUT; /* OUTPUT an observation */
__rc=FETCH(__DSID); /* FETCH the next observation */
END;
__rc=CLOSE(__DSID); /* CLOSE the data set */
__rc=libname("&templib"); /* CLOSE the temporary libref */
stop;
drop __rc __DSID ;
run;