イントラマートでSQLServerの一時テーブルがうまく使用できない
イントラマートで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 ) ; }
見たいに動的にユニークなテーブル名自動生成するのかな?
なんか勘違いしてるのかな・・・?うん、勘違いしているのだろう。