1

在 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 不应与现有的 libref 冲突,不应在用户会话中持续存在,并且不应允许密码等可见。

4

2 回答 2

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;

运行,检查;然后添加一些文本行。然后重新打开视图 - 它将被更新。

于 2013-06-10T13:37:39.060 回答
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;
于 2013-06-11T08:50:05.720 回答