DB2からの変数名を任意の変数名に変更する

[OS]MVS
[リリース] 6.07, 6.08, 6.09E
[キーワード] access, db2, descriptor, variable, name, rename, view

[質問]

バッチ形式またはプログラムでDB2のACCESSビューを作成するとき、ASSIGN=YESを指定するとSASが自動的に変数名を決めてしまいますが、これを任意の変数名で作成できますか。

[回答]

SASは、ACCESSディスクリプタ作成時に以下に示すルールに基づき自動的に変数名を決定します。
DB2のテーブルに8文字以上の変数名がある場合、9文字以降を切り捨て、8文字の変数名を作成します。

   例: COMPANYNAME  -->  COMPANYN
上記で作成した変数名が他の変数名と同じ場合、8文字のうち下2文字を0からの通し番号にします。
   例: COMPNAME1   -->  COMPNAME
       COMPNAME2   -->  COMPNAM0
       COMPNAME3   -->  COMPNAM1
          .                .
       COMPNAME11  -->  COMPNAM9
       COMPNAME12  -->  COMPNA10
SASのネーミングルールに反する文字(#など)が変数名に使用されている場合、その文字を「_」に置き換えます。
   例: COMP#NM  →  COMP_NM

変数名には上記のルールが適用されるため、このルールをふまえた上でプログラムを作成する必要があります。
また、ご質問のようにユーザが任意の変数名を指定しておけば、上記のようなネーミングを気にする必要がなくなります。 任意の変数名を指定するには、以下の例のようにRENAMEステートメントを使用します。

  proc access dbms=db2;
    create xxxx.xxxx.access;
                       /* ライブラリ参照名.accessディスクリプタ名 */
    table=xxxxx.xxxxx;
                       /* DB2テーブル名 */
    assign=yes;
    rename vardb2=varsas 'var#db2'=varsas2 .........;
                       /* rename DB2側変数名=SAS側変数名 */
    create xxxx.xxxx.view;
                       /* ライブラリ参照名.viewディスクリプタ名 */
    select vardb2 'var#db2' ........;
    subset where vardb2='key1' .....;
  run;
  quit;

RENAMEステートメント使用時には、次の点に注意してください。 VIEWディスクリプタ作成時のSELECTおよびSUBSET WHEREステートメントでは、DB2テーブルの変数名を記述します。
DB2テーブルの変数名にSASのネーミングルールに反する文字を含んでいる場合は、変数名を単引用符(')で囲まなければなりません。

[参考]

  • 「SAS Technical Report P-221, SAS/ACCESS Software, Changes and Enhancements」(注文番号 59138)