.net:SQLServeに接続せずにテーブルを使わないSQL文を解釈させる方法を探しています


VB.net2003&SQLServer2000で開発しています。
例えば
SELECT CASE WHEN 1=1 THEN 100 ELSE 200 END AS RESULT
の結果を取得する方法はありませんでしょうか。
本来の構文はもっと複雑です。SQLServerで使用する同内容の(頻繁に変更される)条件式をテーブルに格納しており、これをテーブルから取得して使用するのが目的です。
毎回SQLServerに投げているとトラフィックに左右されるので、ローカルのみで処理したいと考えています。

力技で文字列分解する方法はナシで、なにか方法はありませんでしょうか。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/06/22 11:25:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:chuken_kenkou No.1

回答回数722ベストアンサー獲得回数54

ポイント23pt

条件式をSQL Serverのテーブル内に、列値として格納しているのですか?

条件式を格納したテーブルを全件検索して、結果を「SQL文」の形でスクリプトファイルとして出力し、その後、それらのSQLを一括して実行してはいかがでしょうか?

id:memo77

ああ、書き方が悪かったでしょうか。

SQLServer側ではそのように処理しています。

問題はクライアント側で、VB.netのアプリケーションで同じ条件を非常に頻繁につかいます。

ユーザーの入力スピードにリアルタイムに追随させたいので、いちいちサーバーにSQLの解釈を投げたくない。当該テーブルはDataSetにすでに取得しているので、アプリケーション上だけで処理したい、ということです。

2007/06/15 17:14:49
id:todo36 No.2

回答回数34ベストアンサー獲得回数5

ポイント23pt

案1)ローカルにMSDE2000Aをインストールする

案2)計算専用のSQLServerを別サーバで立てる

案3)条件式をVBScriptまたはJscriptで書く。msscript.ocxで計算する

id:memo77

案1は考えましたが、まあ多数配布するアプリケーションなので、とりあえず没に。

案2はトラフィックはましになりますが、根本的な改善ではないですね。


案3なんですが、条件式をEvalするという意味でしょうか?

SQLServerと共用できないと意味がないので、

CASE WHEN ...

CONVERT(...)

のような構文が解釈できるクラスがあるということでしょうか。

もしあるようでしたら教えていただけると助かります。

2007/06/15 20:50:55
id:todo36 No.3

回答回数34ベストアンサー獲得回数5

ポイント22pt

> SQLServerと共用できないと意味がないので、

なら案3は没。

案4)ACCESSランタイムを配布

Accessは詳しくないので、具体的にはわかりません。

id:wm5775 No.4

回答回数351ベストアンサー獲得回数4

ポイント22pt

【確認】

すでに取得済みのDatasetに対して、あらかじめSQLServerに保存されたT-SQLをダイナミックにローカル側で実行したいということでよろしいでしょうか?

【検討】

Dataset自体は、Resultsetを一時的に格納するデータ構造なので、それらに対してダイレクトにT-SQLを発行するようなインターフェースは用意されていないと思います。どうやらこれらをxpathやxqueryを発行する手段はあるようですが、T-SQLと共有できないのでこの手段はあまり使えないと思います。

【案1】

従って、馬鹿らしい気もしますが、一度ローカルのデータベースに当該テーブルを保存して、ローカルマシンでSQLを再発行するしかないと思います。私だったらT-SQLをそのまま使用できるという観点からMSDEやSQLServer2005Expressを使用すると思います(タダだし)。それが嫌であればSQLAnywareという製品がT-SQL対応で非常に軽いデータベースエンジンを持っており、SQLの記述されているテーブルの同期などもとれるようですし、便利そうです。

http://www.ianywhere.jp/sas/asa.html

【案2】

データベースエンジンを使用するのが嫌だということであれば、T-SQLからxpathやxqueryなどを生成するスクリプトなどを組んで、T-SQLに相当するxpathやxqueryをDatasetにダイレクトに発行するということも出来ると思いますが、効率は見込めないでしょうし、T-SQL->xqueryに正確に変換できるかどうかも非常に疑問です。(それはその他のSQLに対しても同じことが言えるでしょう。Accessを使えというのもT-SQL互換でないのでT-SQLを共有したいという目的は達成されないと思います。)

【案3】

ちょっと、状況が判らないので、はずしているかもしれませんが、

同内容の(頻繁に変更される)条件式をテーブルに格納しており

とありますが、そのような検索が頻繁に発生するということは、DWHやOLAPを構築することで検索するSQL自体の数を劇的に減らして解決することができる問題ということはないでしょうか?その場合、SQLServer側でMOLAPキューブなどを構築することで、あらかじめ分析されたSQL処理は随時処理されるわででなく、データローディング時に分析済みの結果がキューブに適切に格納されるので、かなりオーバーヘッドは減ると思われます。

#SQLServerなどのバージョンでOLAPが構築できない場合、OpenOLAPなどが使えるかもしれません。

id:memo77

普通にわかりにくいお題ですよね^^;

条件式というのは仕入単価に商品群による各種条件を加味して売上単価を生成するものです。

問題は数万行をサーバーで一括処理することと、ユーザーインターフェース上で1品づつ処理することの両方があって、これをサーバー側での最適化のためにSQLで記述しているものです。

キャンペーンや各種利益調整などで数十パターンの計算式を頻繁に入れ替えるので、毎回サーバー用とアプリケーション用を記述すると、何かの間違いでズレが出るのが怖いので共用しています。

ただクライアントからサーバーにいちいち投げていると、入力オペレータのところで、ここでタイピングが一瞬突っかかると言われるわけです。


やはりローカルにSQLServer起こしてやるしかないようですね。

ちょっとクライアントに負荷がかかると思われるので、効果測定して判断かなぁ。

2007/06/17 15:26:46

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません