VB.net2003&SQLServer2000で開発しています。
例えば
SELECT CASE WHEN 1=1 THEN 100 ELSE 200 END AS RESULT
の結果を取得する方法はありませんでしょうか。
本来の構文はもっと複雑です。SQLServerで使用する同内容の(頻繁に変更される)条件式をテーブルに格納しており、これをテーブルから取得して使用するのが目的です。
毎回SQLServerに投げているとトラフィックに左右されるので、ローカルのみで処理したいと考えています。
力技で文字列分解する方法はナシで、なにか方法はありませんでしょうか。
条件式をSQL Serverのテーブル内に、列値として格納しているのですか?
条件式を格納したテーブルを全件検索して、結果を「SQL文」の形でスクリプトファイルとして出力し、その後、それらのSQLを一括して実行してはいかがでしょうか?
案1)ローカルにMSDE2000Aをインストールする
案2)計算専用のSQLServerを別サーバで立てる
案3)条件式をVBScriptまたはJscriptで書く。msscript.ocxで計算する
案1は考えましたが、まあ多数配布するアプリケーションなので、とりあえず没に。
案2はトラフィックはましになりますが、根本的な改善ではないですね。
案3なんですが、条件式をEvalするという意味でしょうか?
SQLServerと共用できないと意味がないので、
CASE WHEN ...
や
CONVERT(...)
のような構文が解釈できるクラスがあるということでしょうか。
もしあるようでしたら教えていただけると助かります。
> SQLServerと共用できないと意味がないので、
なら案3は没。
案4)ACCESSランタイムを配布
Accessは詳しくないので、具体的にはわかりません。
【確認】
すでに取得済みの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などが使えるかもしれません。
普通にわかりにくいお題ですよね^^;
条件式というのは仕入単価に商品群による各種条件を加味して売上単価を生成するものです。
問題は数万行をサーバーで一括処理することと、ユーザーインターフェース上で1品づつ処理することの両方があって、これをサーバー側での最適化のためにSQLで記述しているものです。
キャンペーンや各種利益調整などで数十パターンの計算式を頻繁に入れ替えるので、毎回サーバー用とアプリケーション用を記述すると、何かの間違いでズレが出るのが怖いので共用しています。
ただクライアントからサーバーにいちいち投げていると、入力オペレータのところで、ここでタイピングが一瞬突っかかると言われるわけです。
やはりローカルにSQLServer起こしてやるしかないようですね。
ちょっとクライアントに負荷がかかると思われるので、効果測定して判断かなぁ。
ああ、書き方が悪かったでしょうか。
SQLServer側ではそのように処理しています。
問題はクライアント側で、VB.netのアプリケーションで同じ条件を非常に頻繁につかいます。
ユーザーの入力スピードにリアルタイムに追随させたいので、いちいちサーバーにSQLの解釈を投げたくない。当該テーブルはDataSetにすでに取得しているので、アプリケーション上だけで処理したい、ということです。