proc sql ; describe ステートメント - データセットの定義内容をログに出力する - SAS

proc sql で使用する describe ステートメントは、データセットの定義内容をログに表示するステートメントです。proc contents のログに表示するバージョンみたいな感じです。


1. describe table テストコード - create table

create table で作成したデータセットに対して、describe ステートメントを使ってみます。

options msglevel=i ;

proc sql noprint ;
  create table TEST1
  (
    A decimal
   ,B char(30)
   ,C varchar(10)
   ,D numeric
   ,E float
  )
  ;
  describe table TEST1 ;
quit ;
 59         proc sql noprint ;
 60           create table TEST1
 61           (
 62             A decimal
 63            ,B char(30)
 64            ,C varchar(10)
 65            ,D numeric
 66            ,E float
 67           )
 68           ;
 NOTE: テーブルWORK.TEST1(行数0、列数5)が作成されました。
 69           describe table TEST1 ;
 NOTE: SQLテーブルWORK.TEST1は次のように作成されました:
 
 create table WORK.TEST1( bufsize=65536 )
   (
    A num,
    B char(30),
    C char(10),
    D num,
    E num
   );
 
 70         quit ;
 NOTE: PROCEDURE SQL処理(合計処理時間):
       処理時間           0.02 秒
       CPU時間            0.03 秒
       

文字項目はすべて char に、数値項目は num と出力されます。


2. describe table テストコード - dataステップ + label, format, informat

create table だけでなく、data ステップで作成したデータセットに対してもやってみます。

data TEST1 ;
  label A = "TEST" ;
  A = 1 ;
  B = "STR" ;
  format C 3. ;
  C = 5 ;
  format D yymmdds10. ;
  D = date() ;
  informat E 3. ;
  E = 0 ;
run ;

proc sql ;
  describe table TEST1 ;
quit ;
 69         proc sql ;
 70           describe table TEST1 ;
 NOTE: SQLテーブルWORK.TEST1は次のように作成されました:
 
 create table WORK.TEST1( bufsize=65536 )
   (
    A num label='TEST',
    B char(3),
    C num format=3.,
    D num format=YYMMDDS10.,
    E num informat=3.
   );
 
 71         quit ;
 NOTE: PROCEDURE SQL処理(合計処理時間):
       処理時間           0.01 秒
       CPU時間            0.02 秒

まるで、create table で作ったかのように出力されます。format や informat、label の設定も出力されます。


3. describe table テストコード - インデックス + 一貫性制約

インデックスが作成されていたり、一貫性制約(not null や primary key など)が指定されていた場合、その情報も出力されます。

proc sql ;
  create table TEST1
  (
    A decimal     primary key
   ,B char(30)    not null
   ,C varchar(10) not null
   ,D numeric
   ,E float       distinct
  )
  ;
  create index TEST1_KEY on TEST1(A, B) ;
  describe table TEST1 ;
quit ;
 74         proc sql ;
 75           create table TEST1
 76           (
 77             A decimal     primary key
 78            ,B char(30)    not null
 79            ,C varchar(10) not null
 80            ,D numeric
 81            ,E float       distinct
 82           )
 83           ;
 NOTE: テーブルWORK.TEST1(行数0、列数5)が作成されました。
 84           create index TEST1_KEY on TEST1(A, B) ;
 NOTE: 複合インデックスTEST1_KEYが定義されました。
 85           describe table TEST1 ;
 NOTE: SQLテーブルWORK.TEST1は次のように作成されました:
 
 create table WORK.TEST1( bufsize=65536 )
   (
    A num,
    B char(30),
    C char(10),
    D num,
    E num
   );
 create index TEST1_KEY on WORK.TEST1(A,B);
 create unique index E on WORK.TEST1(E);
 create unique index A on WORK.TEST1(A);
 
 86         quit ;
 NOTE: PROCEDURE SQL処理(合計処理時間):
       処理時間           0.08 秒
       CPU時間            0.09 秒
       

一貫性制約があった場合は、リストにも結果が出力されます。


4. describe table constraints テストコード

一貫性制約の有無だけを調べたい時は、describe table constraints を使います。

proc sql ;
  create table TEST1
  (
    A decimal primary key
   ,B num
  ) ;
  describe table constraints TEST1 ;
  
  create table TEST2
  (
    A decimal
   ,B num
  ) ;
  describe table constraints TEST2 ;
quit ;
 62         proc sql ;
 63           create table TEST1
 64           (
 65             A decimal primary key
 66            ,B num
 67           ) ;
 NOTE: テーブルWORK.TEST1(行数0、列数2)が作成されました。
 68           describe table constraints TEST1 ;
 NOTE: SQLテーブルWORK.TEST1 ( bufsize=65536 ) には次の一貫性制約があります : 
 
 69         
 70           create table TEST2
 71           (
 72             A decimal
 73            ,B num
 74           ) ;
 NOTE: テーブルWORK.TEST2(行数0、列数2)が作成されました。
 75           describe table constraints TEST2 ;
 NOTE: SQLテーブルWORK.TEST2 ( bufsize=65536 ) には、記述する一貫性制約がありません。
 76         quit ;
 NOTE: PROCEDURE SQL処理(合計処理時間):
       処理時間           0.08 秒
       CPU時間            0.07 秒

5. describe view テストコード - SQLビュー

VIEW がどのように作られているかは、describe view で表示することがきます。

proc sql ;
  create view V1 as select * from TEST1 ;
  describe view V1 ;
  drop view V1 ;
quit ;
 80         proc sql ;
 81           create view V1 as select * from TEST1 ;
 NOTE: SQLビューは WORK.V1 定義されました。
 82           describe view V1 ;
 NOTE: SQLビュー WORK.V1 は次のように定義されています :
 
         select *
           from TEST1;
 
 83           drop view V1 ;
 NOTE: ビュー WORK.V1 を削除しました。
 84         quit ;
 NOTE: PROCEDURE SQL処理(合計処理時間):
       処理時間           0.01 秒
       CPU時間            0.01 秒

6. describe view テストコード - DATA STEPビュー

残念ながら、dataステップで作成したビューは表示できないみたいです。

data TEST_V / view=TEST_V ;
  set TEST1 ;
  A = 1 ;
run ;

proc sql ;
  describe view TEST_V;
quit ;
 57         data TEST_V / view=TEST_V ;
 58           set TEST1 ;
 59           A = 1 ;
 60         run ;
 
 NOTE: DATA STEPビューをファイルWORK.TEST_Vに保存しました。
 NOTE: ストアドDATA STEPビューは異なるオペレーティングシステムでは実行できません。
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.03 秒
       CPU時間            0.02 秒
       
 
 61         
 62         proc sql ;
 63           describe view TEST_V;
 WARNING: WORK.TEST_V は SQL ビューではありません。
 64         quit ;
 NOTE: PROCEDURE SQL処理(合計処理時間):
       処理時間           0.00 秒
       CPU時間            0.01 秒
       

(2015/09/22 追記)

ビューの生成コードを出力するdescribeについて、SQLビューとデータステップビューだと方法が違うから気を付けてって話 | データステップ100万回 SAS新手一生 」にて、DATA STEPビューの定義内容を表示する方法が紹介されていました。 dataステップ内にて、describeステートメントを使うことでできるようです。

data view=TEST_V ;
  describe ;
run ;
 68         data view=TEST_V ;
 69           describe ;
 70         run ;
 
 NOTE: DATAステップビューWORK.TEST_Vの定義:
 
 data TEST_V / view=TEST_V ;
    set TEST1 ;
    A = 1 ;
 run ;
 
 
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.02 秒
       CPU時間            0.02 秒

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意