Sas 是否可以查看哪个程序创建了表和/或上次修改了表?

Sas 是否可以查看哪个程序创建了表和/或上次修改了表?,sas,metadata,Sas,Metadata,我正在使用SAS EG,正在查看我保存在库中的一些表。我需要知道某个表的来源,但我找不到任何类似的元信息,例如,哪个SAS程序创建了它或上次修改了它。如果有人知道一种方法,那将非常感激 简短回答:否。 没有存储关于哪个“程序”创建或修改表的元信息。甚至“程序”的概念也与您相关,但与SAS无关。您的SAS服务器被发送它执行的代码,并且它很少关心SAS程序或所述代码来自的EG项目的名称 假设您的SAS环境存储了workspace服务器日志,您最好的希望是查看这些日志,以在提交的代码中查找对某个表的引

我正在使用SAS EG,正在查看我保存在库中的一些表。我需要知道某个表的来源,但我找不到任何类似的元信息,例如,哪个SAS程序创建了它或上次修改了它。如果有人知道一种方法,那将非常感激

简短回答:否。
没有存储关于哪个“程序”创建或修改表的元信息。甚至“程序”的概念也与您相关,但与SAS无关。您的SAS服务器被发送它执行的代码,并且它很少关心SAS程序或所述代码来自的EG项目的名称


假设您的SAS环境存储了workspace服务器日志,您最好的希望是查看这些日志,以在提交的代码中查找对某个表的引用。有了包含的时间戳、用户ID和打印的代码,您应该可以找到您要查找的所有信息,但这将是一个费力的过程。

不,没有直接的方法可以查看是哪个特定程序修改了数据集。SAS跟踪发送到处理器的指令;直到最近,你甚至可以在窗口中同时打开多个程序

但是,您可以知道数据集是何时创建和上次修改的,这可能会为您提供所需的信息(尤其是在运行程序时记录)

如果需要,还可以在程序中使用dataset标签将程序名添加到数据集中,但必须主动这样做

data want(label='myprogram.sas');
  set sashelp.class;
run;
根据您的运行方式(Batch、DM SAS,例如Studio、SAS CONNECT等),可能会有一个包含程序名的宏变量,您可以将该变量添加到所有程序中,使其自动运行

例如,当您指定EG时,有一组全局宏变量可能很有用:

GLOBAL _CLIENTMACHINE '[machinename]'
GLOBAL _CLIENTPROCESSFLOWNAME 'Process Flow'
GLOBAL _CLIENTPROJECTNAME ''
GLOBAL _CLIENTPROJECTPATH ''
GLOBAL _CLIENTPROJECTPATHHOST ''

但是,这同样是有帮助的,因为它不是已经写入数据集的东西,所以不能帮助您确定过去发生了什么。

我同意其他答案,到目前为止,不,我知道元数据中没有创建程序的记录或类似的记录。如果有的话,我不知道我会有多依赖它,因为我和我的同事经常使用%include从外部文件中获取信息-是否会列出源代码或源代码程序

无论如何,我以前也遇到过类似的情况,在追踪创建神秘数据集的程序时,有一件事确实起到了作用,那就是使用文件名管道搜索网络驱动器上所有扩展名为.sas的程序,查找可用于创建该表的任何常见语句(例如。“数据libname.datasetname;”

值得称赞的地方:下面的大部分代码都是根据Brian Varney的白皮书改编的。我希望我能记住更多的细节

filename pipedir pipe ' dir "<ENTER THE TARGET DIRECTORY TO SEARCH HERE>" /S' lrecl=5000;

data indata;
infile pipedir truncover;
input line $char1000.;
length directory $1000;
retain directory;
if line =' ' or
index(upcase(line),'<DIR>') or
left(upcase(line))=:'VOLUME' then
delete;
if left(upcase(line))=:'DIRECTORY OF' then
directory=left(substr(line,index(upcase(line),'DIRECTORY OF')+12));
if left(upcase(line))=:'DIRECTORY OF' then
delete;
if input(substr(line,1,10),?? mmddyy10.) = . then
substr(line,1,10)='12/31/2999';
date=input(substr(line,1,10),?? mmddyy10.);
format date mmddyy10.;
run;
proc sort data=indata;
by directory descending date;
run;

data Directory_Summary(drop=i line);
set indata;
by directory;
length filename $75;
retain number_of_files_in_directory directory_size;
if first.directory then
do;
number_of_files_in_directory=input(scan(line,2,' '),32.);
directory_size=input(scan(line,4,' '),comma32.);
end;
file_size=input(scan(line,4,' '),comma32.);
filename=' ';
do i=5 to 100;
filename=trim(left(filename))||' '||scan(line,i,' ');
if scan(line,i,' ')=' ' then
leave;
end;
if index(upcase(line),'FILE(S)') then
delete;
if date ge '30DEC2999'd then
delete;
run;

proc sql noprint;
select distinct directory into :dir1 - :dir9999
from directory_summary
where scan(lowcase(filename),-1,'.')='sas';
quit;
%let numdirs=&sqlobs.;
%put &numdirs.;
proc datasets nolist lib=work;
delete allprgs;
quit;

%macro getsasprgs;
%do i=1 %to &numdirs.;
data prgs;
length line sasprogram f $300;
infile "&&dir&i.\*.sas" FILENAME=f;
input;
sasprogram =f ;
linenum+1;
if lag(sasprogram) ne sasprogram then linenum=1;
line=_infile_;
run;
proc append base=allprgs data=prgs;
run;
%end;
%mend getsasprgs;
%getsasprgs;

proc sql;
select *
from allprgs
where lowcase(line) ? "<ENTER THE LINE OF CODE YOU WANT TO FIND HERE>";
quit;
filename pipedir pipe'dir”“/S'lrecl=5000;
数据索引;
填充式管道阀;
输入行$char1000。;
长度目录1000美元;
保留目录;
如果行=“”或
索引(大写(行),“”)或
左(大写(行))=:“卷”然后
删除;
如果左(大写(行))=:“目录”,则
directory=left(substr(行,索引)(upcase(行),'directory OF')+12));
如果左(大写(行))=:“目录”,则
删除;
如果输入(substr(行,1,10),?mmddyy10。)=,则
substr(第1,10行)='12/31/2999';
日期=输入(子字符串(行,1,10),?mmddyy10);
格式日期mmddyy10。;
跑
proc sort data=indata;
按目录降序日期;
跑
数据目录\u摘要(drop=i行);
设置indata;
按目录;
长度:75美元;
在目录大小中保留文件数量;
如果是第一个目录,那么
做
目录中的文件数=输入(扫描(第2行),32);
目录大小=输入(扫描(第4行),comma32.);
结束;
文件大小=输入(扫描(第4行),comma32);
文件名=“”;
i=5到100;
filename=trim(左(文件名))| |“| |扫描(行,i)”;
如果扫描(行,i,“)=”,则
离开
结束;
如果索引(upcase(行),“文件”,则
删除;
如果日期为ge'30DEC2999'd则
删除;
跑
proc-sql-noprint;
选择不同的目录到:dir1-:dir9999
从目录\u摘要
其中scan(lowcase(文件名),-1,'.')='sas';
退出
%设numdirs=&sqlobs。;
%放置&numdirs。;
proc数据集nolist lib=工作;
删除所有PRG;
退出
%宏观调控;
%i=1%到&numdirs。;
数据PRG;
长度线SASF计划300美元;
infle“&&dir&i.\*.sas”文件名=f;
输入;
sasprogram=f;
linenum+1;
如果lag(sasprogram)为ne sasprogram,则linenum=1;
行=_填充u;
跑
proc append base=allprgs data=prgs;
跑
%结束;
%修复SASPRGS;
%getsasprgs;
proc-sql;
挑选*
来自所有PRG
低箱(线)在哪里?“”;
退出
祝你好运