数据步骤视图中的动态库定义

时间:2013-06-10 13:23:36

标签: view sas

在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冲突,不应该在用户会话中持久存在,并且不应该允许密码等可见..

2 个答案:

答案 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;