Невозможно прочитать SAS View, используя другое имя библиотеки, отличное от того, которое использовалось для создания представления - PullRequest
0 голосов
/ 15 марта 2019

Я создал представление в SAS для чтения нескольких наборов данных. Я могу читать данные из этого представления, только если я даю то же имя библиотеки, которое использовалось для создания представления.

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.

Пожалуйста, сообщите

Ответы [ 3 ]

3 голосов
/ 16 марта 2019

Я не уверен, что считаю это хорошей идеей, но если вы действительно хотите это сделать, вы можете встроить определение libname в представление с помощью предложения using. Также укажите путь к имени представления, и вам даже не придется создавать 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 голос
/ 16 марта 2019

Создать вид

A create view создает инструкции для использования при обращении к представлению для обработки. Оператор select проверен на синтаксис , но не проверен в отношении источников данных . Таким образом, конструкция представления содержит непроверенные librefs, имена таблиц и имена столбцов, которые понадобятся при обработке.

Вы можете создать представление, даже если у сеанса нет активных имен файлов (см. Пример ниже). Создание представления сродни написанию и сохранению программы SAS, но не отправке ее сразу.

Libname и libref

Оператор libname создает ссылку на библиотеку, или сокращенно libref. Из документации (мой жирный):

LIBNAME Statement

Связывает или разъединяет библиотеку SAS с libref (сокращенное имя), очищает один или все librefs, перечисляет характеристики библиотеки SAS, объединяет библиотеки SAS или объединяет каталоги SAS.

Термин libname используется в обсуждении при идентификации экземпляра libref, но иногда имя libb используется, когда подразумевается более технически точный термин libref . Типичный опыт для пользователей SAS заключается в том, что имя библиотеки связывается с одной папкой или каталогом.

Просмотр использования (исполнение)

При обращении к представлению выполняются инструкции обработки, используя текущее состояние сеанса SAS относительно активных librefs, для создания набора результатов.

Это хорошо!

  • В специальной среде представление может быть передано пользователям, и они могут решить, на какую библиотеку указывает libref .
  • В производственной среде администратор SAS должен гарантировать, что libref указывает на правильную и текущую библиотеку.
  • Чтобы использовать представление в том же состоянии сеанса, в котором оно было, когда оно было создано, текущие и будущие сеансы должны иметь одинаковые librefs и необходимое содержимое библиотеки.
  • Если представление не выполняется по причинам, связанным с именами библиотек, просто создайте необходимые имена библиотек, указывающие на соответствующие библиотеки.
* 1 056 * Пример * 1 059 *

Ричард создатель представления

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) Бобу и Джейн.

Сессия Боба

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 голосов
/ 16 марта 2019

Проблема заключается в «тесте» в запросе представления, а не в 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;

@ Том предоставил обходной путь.

...