我在SAS中创建了一个视图来读取多个数据集。只有当我提供用于创建视图的相同libname时,才能从此视图中读取数据。
libname test "c:\temp";
data test.one; x=1; run;
data test.two; x=2; run;
data test.three; x=3;
run;proc sql ;
create view test.master as
select * from test.one union
select * from test.two union
select * from test.three;
quit;
data test;
set test.master;
run;
上面的代码运行正常,但是当我打开一个新的sas会话并使用不同的libname时,我得到错误:
libname new "c:\temp";
data test;
set new.master;
run;
ERROR: Libref TEST is not assigned.
ERROR: Libref TEST is not assigned.
ERROR: Libref TEST is not assigned.
ERROR: SQL View TEST.PANEL2 could not be processed because at least one of the data sets, or views, referenced directly (or
indirectly) by it could not be located, or opened successfully.
请指教
我不确定我认为这是个好主意,但是如果你想这样做,那么你可以使用using
子句将libname定义嵌入到视图中。将路径放入视图名称中,您根本不需要创建libref test
。
proc sql ;
create view 'C:\temp\master' as
select * from test.one union
select * from test.two union
select * from test.three
using libname test 'C:\temp'
;
quit;
现在您不需要使用相同的libref,但请注意,您需要使用相同的物理位置。
创建视图
create view
创建在访问视图进行处理时使用的指令。检查select
语句的语法,但不检查数据源。因此,视图构造包含未经验证的libref,表名以及处理期间所需的列名。
即使会话没有活动的libnames,也可以创建视图(请参阅下面的示例)。视图创建类似于编写和保存SAS程序,但不能立即提交。
Libname和libref
libname
语句创建一个库引用,或简称为libref。从文档(我的粗体):
LIBNAME声明
将SAS库与libref(快捷方式名称)关联或解除关联,清除一个或所有libref,列出SAS库的特征,连接SAS库或连接SAS目录。
当识别libref的实例时,术语libname
用于讨论,但有时在更精确技术术语libref时使用libname。 SAS用户的典型体验是libname与单个文件夹或目录相关联。
查看使用(执行)
当访问视图时,使用SAS会话的当前状态相对于活动的libref执行处理指令,以便创建结果集。
这是件好事!
例
观看者理查德
libname shazaam; * now there is no shazaam ! ;
proc sql;
create view sasuser.lightning as
select * from shazaam.powersource
where situation='danger'
and pigs='fly'
and
;
理查德将他的sasuser.lightning
观点(*.sas7bvew
)发送给Bob和Jane。
鲍勃的会议
libname shazaam 'c:\super-heroes\shaz\sasdata';
proc sql;
select * from sasuser.lightning;
--- FAILS because shazaam.powersource exists but powersource does not have column `pigs`.
简的会议
libname shazaam 'c:\heroes\shazaam_v2\sasdata'
proc sql;
select * from sasuser.lightning;
--- WORKS because in Jane's '_v2' data shazaam.powersource exists and column `pigs` is present
问题是视图查询中的“测试”,而不是libname
。请记住,视图仅在您尝试访问时运行。
因此,如果库存在,视图可以运行,但由于test
库不存在,它正在尝试从不存在的库中读取。
以下是您的“视图”的示例:
libname test "/folders/myfolders/Temp";
proc sql ;
create view test.master as
select * from sashelp.cars (obs=4) union
select * from sashelp.cars (firstobs=10 obs=14) union
select * from sashelp.cars (firstobs=30 obs=34);
quit;
data test;
set test.master;
run;
libname test ;
libname new "/folders/myfolders/Temp";
data test2;
set new.master;
run;
@Tom提供了一种解决方法。