除了用于创建视图的名称之外,无法使用不同的libname读取SAS View

问题描述 投票:-1回答:3

我在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.

请指教

view sas
3个回答
3
投票

我不确定我认为这是个好主意,但是如果你想这样做,那么你可以使用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,但请注意,您需要使用相同的物理位置。


1
投票

创建视图

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执行处理指令,以便创建结果集。

这是件好事!

  • 在ad-hoc环境中,视图可以在用户之间传递,他们可以决定libref指向哪个库。
  • 在生产环境中,SAS管理员将确保libref指向正确的当前库。
  • 为了在创建时使用相同会话状态的视图,当前和将来的会话必须具有相同的libref和必要的库内容。
  • 如果视图因libnames原因而失败,只需创建指向正确库的所需libnames即可。

观看者理查德

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

0
投票

问题是视图查询中的“测试”,而不是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提供了一种解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.