イントラマートでSQLServerの一時テーブルがうまく使用できない

2018-02-07イントラマート

イントラマートでSQLServerの一時テーブルがうまく使用できない時の対応方法です。

イントラマートとは
株式会社NTTデータイントラマート社が開発・販売している、Webアプリケーションシステムのシステム共通基盤(統合型フレームワーク)で、国内の著名企業を中心に6,000社以上に導入されています。 イントラマートを導入することにより、Webシステム開発における短納期・低コスト・標準化推進・品質向上を実現できます。
詳しくはこちらをご覧ください。

イントラマートでSQLServerの一時テーブルがうまく使用できない

一旦SQLで取得したデータをSQLServerの一時テーブルに保存して処理を実行させたいことがあったので、一時テーブルを作成してみましたがどうも上手く行きません。

var objTemp1 = DatabaseManager.execute( "CREATE TABLE #test_tmp (cd INT,
 name varchar(10))" ) ;
if( objTemp1.error ){    //エラー発生?
    Module.alert.write( "エラー発生1=" + objTemp1.errorMessage ) ;
}
var objTemp2 = DatabaseManager.execute("SELECT COUNT(*) FROM #test_tmp" 
) ;
if( objTemp2.error ){    //エラー発生?
    Module.alert.write( "エラー発生2=" + objTemp2.errorMessage ) ;
}

上記を実行すると

#エラー発生2=オブジェクト名 '#test_tmp' が無効です。[ja]

作った直後にSELECTしても一時テーブルの内容が見れません。

実験で「ローカル#(一時テーブル)」ではなく「グローバル##(一時テーブル)」に置き換えると

var objTemp1 = DatabaseManager.execute( "CREATE TABLE ##test_tmp (cd INT, name varchar(10))" ) ;
if( objTemp1.error ){    //エラー発生?
    Module.alert.write( "エラー発生1=" + objTemp1.errorMessage ) ;
}
var objTemp2 = DatabaseManager.execute("SELECT COUNT(*) FROM ##test_tmp" ) ;
if( objTemp2.error ){    //エラー発生?
    Module.alert.write( "エラー発生2=" + objTemp2.errorMessage ) ;
}

思い通りの結果でOK。

全ユーザーが見れる必要もないし、できれば見えない方がありがたい・・・。

しかも同時にこの処理実行されたら「グローバル##(一時テーブル)」を両方が作りに
行ってエラーになるのでは・・・?(面倒だからやってませんが。)
しかもログインユーザーによって「ローカル#(一時テーブル)」に挿入されるデータは
異なるんですが・・・。

と言う事は

var tmp_tablename = Identifier.get() ;
var objTemp1 = DatabaseManager.execute( "CREATE TABLE ##" + tmp_tablename + " (cd INT, name varchar(10))" ) ;
if( objTemp1.error ){    //エラー発生?
    Module.alert.write( "エラー発生1=" + objTemp1.errorMessage ) ;
}
var objTemp2 = DatabaseManager.execute("SELECT COUNT(*) FROM ##" + tmp_tablename" ) ;
if( objTemp2.error ){    //エラー発生?
    Module.alert.write( "エラー発生2=" + objTemp2.errorMessage ) ;
}

見たいに動的にユニークなテーブル名自動生成するのかな?
なんか勘違いしてるのかな・・・?うん、勘違いしているのだろう。

株式会社システムトラスト

イントラマートの導入・開発についてなど気軽にご相談ください。

お問合せ