2016-08-30 14 views
2

質問は非常に簡単です。私は、すべての4つのデータセットを必要とする他に、私は唯一のT1T2必要複数の結果セットのみを取得する

SELECT * 
FROM T1 

SELECT * 
FROM T2 

SELECT * 
FROM T3 

SELECT * 
FROM T4 

ケース1の場合:私は、次のSQLを持っています。 は私だけT1T2を返す別のストアドプロシージャを記述する必要があり、または私はちょうど(SQLエンジンにバッチを実行せずに)最後の二つのデータセットをスキップすることができます。私は次のコード

var reader = command.ExecuteReader(); 
ReadSet1(); 
reader.NextResult(); 
ReadSet2(); 
reader.Close() 

でのみT1T2をフェッチする場合、私は意味

は、SQLサーバーは、実際にT3T4のためのバッチを実行していますか?

+0

フェッチされたときの対策のためのgetdateを返すことができる場合は、手順でSQL文を持っていますか、新しい値が表示されないのでしょうか?もしそうであれば、パラメータ(例えば '@ tablesToLoad'など)を追加して、プロシージャのIF文を使って目的の結果を得ることができます。 –

+0

'私はすべての4つのデータセットが必要ですが、他にはT1とT2だけが必要です。最良の方法は、それぞれのケースごとに独立したprocsを書くことです。 – TheGameiswar

+0

@diiN_もちろん、プログラムの流れをコントロールしていますすべて。私の質問は主に、SQL Serverが結果を送信する前にプロシージャ全体を実行するか、別々の結果セットを実行するかどうかについてです。 –

答えて

2

リーダーのみ)(これまでの先行

読み込みます。しかし、それはあなたがT1は、(行数が低い場合を除き)あなたは、新しい値が表示されますT4
の値を変更読んだ後

この
を試してみて、バッファに収まる場合を除き、それはそれをすべて実行されません
あなたはSQLが開始

ですべての4を実行します。また、行が

+0

本当ですか?これは分離レベル、トランザクションの範囲とより多くの影響に依存する必要があります... – Shnugo

+0

@ Shnugoあなた自身のためのテスト。これは私が得た結果です。 – Paparazzi

+0

@パパラッチ私は、トランザクションのscropeがこの動作を変更し、より多くのテストを必要とするかもしれないと思うが、トランザクション以外のトランザクションでは少なくとも動作する。 –

0

SQL Serverは、アプリケーション内で結果セットを使って何を行っているのか分からないため、結果セットを必要に応じて準備します。少なくとも私はそう思う。

...あなたはSELECTを一度または1つ他の後、行われる瞬間に監視するために、プロファイラを開くことがあります...しかし、私は手順はすべてのために実行されることを、かなり確信している

あなたは可能性があります

  • は、各SELECT(実際にはより良いインラインテーブル値関数)のための1つの手順を作成します。これは確かです!より良い、よりクリーンなアプローチですが、呼び出し側アプリケーションのコードに大きな影響を与える可能性があります。または

  • @LoadT1 BIT, @LoadT2 BIT...のようなパラメータで渡し、IFの後にロードします。 C#-codeには、おそらく、呼び出しを実行する既存の関数またはメソッドがあります。この関数には、デフォルト値(オプションのパラメータ)を持つ4つのブール値パラメータを与えます。既存のコードを変更する必要はありません。しかし、これが理にかなっている場合は、適切なパラメータを設定するだけです。

0

ExecuteReaderは、その全体を実行します。プロファイラを見て、階段の間にコードの遅延を入れると、それが表示されます。あなたが持っている他のステップは、procに反するものではなく、procの実行結果とあなたの読者の形で反対します。あなたは何をすべき

は意見とのトレードオフの問題です。一方で、同じprocを使用すると、データセット1または2に対して何かを修正する必要がある場合、コードを再利用し、コードを変更する場所が半分になるという利点があります。 2つのprocsまたは4)あなたは効率の利点があります。だから、実際にはクエリがどれくらい高価なのかが分かります...少なくともそれが私にとっての決定者になるでしょう。一般的には、4つの独立したprocsを持つのが最善の方法だと言えますが、実際には影響の少ないクエリであれば、時間を費やすことはわかりません。

Shnugoがもたらしたもう1つのオプションは、1つまたは複数のパラメータを持つことです。多分@ returnAll4 BITと言います。アプリケーションはそれを渡し、0/falseの場合、WHERE @ returnAll4 = 1フィルタをそれらに置くことで、3番目と4番目のデータセットの実行を避けることができます。実行計画の中にはまだそれらが表示されますが、フィルタ評価以外は実際には実行されません。私はそのアプローチを使用しましたが、将来別の開発者にとっては不明確かもしれないと心配しているので、私はそれを避ける傾向があります。それはのNextResultを開始すること

+0

私は、はるかに簡単なソリューションがあると考えています:各テーブルに1つずつ、4つのパラメータでSPを作成します。 C#-codeには、おそらく、呼び出しを実行する既存の関数またはメソッドがあります。この関数には、デフォルト値(オプションのパラメータ)を持つ4つのブール値パラメータを与えます。既存のコードを変更する必要はありません。しかし、これが意味をなさない場合は、適切なパラメータを設定するだけです。これは私が私の答えを書くことを心に持っていたものです... – Shnugo

関連する問題