Ошибка при динамическом переименовании набора данных SAS - PullRequest
0 голосов
/ 11 октября 2018

ФОН

У меня есть скрипт, который запускается каждый месяц, создавая набор данных для использования моей командой.Сценарий генерирует наборы данных в моем личном каталоге UNIX, затем я запускаю проверки работоспособности и копирую набор данных в «публичный» каталог, где моя команда может получить к нему доступ.Сценарий стабилен, поэтому больше не нужно запускать проверки работоспособности.

ЧТО ХОЧУ ДЕЛАТЬ

  • Извлечь дату последнего изменения из предыдущей версиинабор данных из общей папки (Работает нормально)
  • Поменять имя предыдущего набора данных с датой изменения (возникают проблемы)
  • Переместите / скопируйте вновь созданный набор данных в общую папку (Работает нормально)

ПОСТАНОВКА ПРОБЛЕМЫ

Я получаю следующую ошибку при попытке изменить имя набора данных

ОШИБКА: Вы не можете переименовать COSTDATA.EMPL_CHAIN.DATA to COSTDATA.EMPL_CHAIN_19SEP18.DATA, поскольку COSTDATA.EMPL_CHAIN.DATA используется вами в среде ресурсов IOM ROOT COMP ENV.

CODE USED

%let dsid2=%sysfunc(open(costdata.empl_chain));
%put ********&dsid2;
%let modte2=%sysfunc(attrn(&dsid2,modte),datetime7.);
%put &modte2;
%let rc=%sysfunc(close(&dsid2));
%put RC Value is &rc;

proc datasets library=costdata;
change empl_chain=empl_chain_&modte2;
run;

SAS LOG

29         %let dsid2=%sysfunc(open(costdata.empl_chain));
30         %put ********&dsid2;
********2
31         %let modte2=%sysfunc(attrn(&dsid2,modte),datetime7.);
32         %put &modte2;
19SEP18
33         %let rc=%sysfunc(close(&dsid2));
34         %put RC Value is &rc;
RC Value is 0
35         


36         proc datasets library=costdata;
37         change empl_chain=empl_chain_&modte2;
38         run;

NOTE: Changing the name COSTDATA.EMPL_CHAIN to COSTDATA.EMPL_CHAIN_19SEP18 (memtype=DATA).
ERROR: You cannot rename COSTDATA.EMPL_CHAIN.DATA to COSTDATA.EMPL_CHAIN_19SEP18.DATA because COSTDATA.EMPL_CHAIN.DATA is in use by you in resource environment IOM ROOT COMP ENV.
39

Другая полезная информация:

Я пытаюсь выполнить операцию, аналогичную нескольким наборам данных.Часть переименования отлично работает для первого набора данных, если сеанс SAS EG новый.Это предсказуемо терпит неудачу для второго набора данных вперед.В EG, Инструменты> Параметры> Данные> Общие данные ... флажок «Автоматически открывать данные при добавлении в проект» снят, как предложено SAS.

Мне также известны другие простые приемы, такие как объявлениеновый набор данных с правильным именем в новом шаге данных или с помощью функции 'exchange' в наборе данных proc.Я хотел бы знать, однако, если есть какое-либо решение вышеуказанной ошибки.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Альтернативный подход - получить модифицированную дату другим способом.

%let dset = CLASS;

proc sql noprint;
select put(datepart(modate), yymmddn8.) into :modte
from sashelp.vtable
where libname='WORK' and memname="&dset.";
quit;

%put &modte.;


proc datasets library=work;
change &dset. = &dset._&modte.;
run;
0 голосов
/ 12 октября 2018

Ну, я потерян.Ваш код работает нормально для меня, начиная с EG 7.15 и заканчивая сеансом SAS 9.4M4 в Linux.Ниже приведен пример использования библиотеки WORK.Можете ли вы использовать, чтобы увидеть, воспроизводит ли это проблему в вашей среде, и если нет, можете ли вы опубликовать полный код, который воспроизводит проблему, используя данные, созданные из наборов данных SASHELP?

Из общего журнала, он выглядит как всекоды возврата хороши, поэтому код SAS не должен блокировать файл.Если у вас есть воспроизводимый пример, возможно, попробуйте отправить его на сервер (если вы можете получить доступ через ssh), просто чтобы посмотреть, вызывает ли EG блокировку.

data class ;
  set sashelp.class ;
run ;

data shoes ;
  set sashelp.shoes ;
run ;

%let dsid2=%sysfunc(open(work.class));
%put ********&dsid2;
%let modte2=%sysfunc(attrn(&dsid2,modte),datetime7.);
%put &modte2;
%let rc=%sysfunc(close(&dsid2));
%put RC Value is &rc;

proc datasets library=work;
change class=class_&modte2;
run;

%let dsid2=%sysfunc(open(work.shoes));
%put ********&dsid2;
%let modte2=%sysfunc(attrn(&dsid2,modte),datetime7.);
%put &modte2;
%let rc=%sysfunc(close(&dsid2));
%put RC Value is &rc;

proc datasets library=work;
change shoes=shoes_&modte2;
run;
0 голосов
/ 11 октября 2018

https://communities.sas.com/t5/SAS-Programming/sysfunc-open-causes-table-to-be-locked-if-error-occurs/td-p/57601 обсуждается ряд причин

В том числе:

  • LOCK ed членов
  • Поддерживается открытым настройками клиента (EG)
  • Открыт с ошибками и без проверок open функция

Что такое dsid, возвращенный после второй попытки %sysfunc(open и %sysfunc(sysmsg())?

Можете ли вы подключиться к вашему Unix-узлу и выдать команду list lockers ?Такие команды, как flock lslock, lslk, lsof

...