Sas 提取SQL描述表输出

Sas 提取SQL描述表输出,sas,ddl,Sas,Ddl,以下是: proc sql; describe table sashelp.class; 生成(在日志中): 任何完整性约束都会发送到输出窗口-可通过以下方式在SAS中访问: ods output IntegrityConstraints=MyDataset; 除了重定向日志(proc printto)或构建生成器(通过proc contents或字典/sashelp视图)之外,还有其他方法提取上述DDL吗 我尝试了ODS跟踪,但看不到正在创建任何其他输出。如果您愿意重定向日志(尽管是暂时的

以下是:

proc sql; describe table sashelp.class;
生成(在日志中):

任何完整性约束都会发送到输出窗口-可通过以下方式在SAS中访问:

ods output IntegrityConstraints=MyDataset;
除了重定向日志(
proc printto
)或构建生成器(通过
proc contents
或字典/sashelp视图)之外,还有其他方法提取上述DDL吗


我尝试了ODS跟踪,但看不到正在创建任何其他输出。

如果您愿意重定向日志(尽管是暂时的),以下内容可能会很有用:

/* macro */
%macro get_ddl(ds=,outfile=);
   filename tmp temp;
   proc printto log=tmp;quit;
   proc sql; describe table &ds;
   proc printto log=log;quit;
   data _null_;
      infile tmp;
      file &outfile;
      input;
      if _infile_=:'NOTE: SQL table ' then start+1;
      else if _infile_=:'NOTE: PROCEDURE SQL used' then stop;
      else if index(_infile_,'            The SAS System       ') then delete;
      else if start=1 then put _infile_;
      putlog _infile_;
   run;
   filename tmp;
%mend;

/* test */
proc sql;
create table people
   (
     name      char(14),
     gender    char(6),
     hired     num,
     jobtype   char(1) not null,
     status    char(10),

    constraint prim_key primary key(name),
    constraint gender check(gender in ('male' 'female')),
    constraint status check(status in ('permanent' 
                            'temporary' 'terminated')) 
  );

%get_ddl(ds=people,outfile="C:\temp\test.ddl");
请注意,列约束不在上述输出上(它们需要从IntegrityConstraints输出导出)


虽然这些信息不可“重定向”,但确实有点奇怪。

事实上,我很难解析您想要从中得到什么。您想要的是
create table…
位,而不是完整性约束?你真正想要的是什么-你打算用这些信息做什么?实际上我两者都想要。。我的目标是构建一个DDL生成器。我认为CREATETABLE(log)输出与约束相结合,为我提供了重建数据集所需的一切,难道你不能使用
创建像Y一样的表X
来完成吗?我很难理解你可能想要什么,这既不是
创建像Y一样的表X
,也不是从
字典中更容易获得。列/表
,而不是从上面得到的,也许我没看到你在做什么。对于相同的信息,您可能会考虑<代码> PROC内容< /代码>,因为它有大量的ODS输出对象可以抓取。是的,我不知道有什么方法可以在没有日志重定向的情况下专门获取上面的日志。
/* macro */
%macro get_ddl(ds=,outfile=);
   filename tmp temp;
   proc printto log=tmp;quit;
   proc sql; describe table &ds;
   proc printto log=log;quit;
   data _null_;
      infile tmp;
      file &outfile;
      input;
      if _infile_=:'NOTE: SQL table ' then start+1;
      else if _infile_=:'NOTE: PROCEDURE SQL used' then stop;
      else if index(_infile_,'            The SAS System       ') then delete;
      else if start=1 then put _infile_;
      putlog _infile_;
   run;
   filename tmp;
%mend;

/* test */
proc sql;
create table people
   (
     name      char(14),
     gender    char(6),
     hired     num,
     jobtype   char(1) not null,
     status    char(10),

    constraint prim_key primary key(name),
    constraint gender check(gender in ('male' 'female')),
    constraint status check(status in ('permanent' 
                            'temporary' 'terminated')) 
  );

%get_ddl(ds=people,outfile="C:\temp\test.ddl");