2011-07-27 13 views
0

複数の列を返すストアドプロシージャがあります。 colA colB colC .... colL colC/colB <が10%、つまりWHEREフィルタが10%の場合、同じ列を取得するための別のクエリを記述できますか?基本的には、ストアドプロシージャによって返される列と同じ列が表示されるはずですが、今の場合colC/colBは< 10%になるはずです。他のアプリケーションで使用されているストアドプロシージャを変更することはできません。値を取得するだけです。クエリの微調整に関するSQLの質問

答えて

1

あなたが保存されprocdureの結果セットから直接選択することはできませんので、テーブル変数(@)、または一時テーブル(#)を使用する必要があります。

DECLARE @table TABLE (colA int, colB int, colC int, ...) 

INSERT INTO @table 
EXEC StoreProcedureName 

SELECT * FROM @table WHERE colC * 10 < colB 
1

これはうまくいくはずです。割合とかをやってたからあなたを妨げる

WHERE (colC * 10) < ColB 

:私はこのようなWHERE句を追加することをお勧めかもしれません。

あなたのコードで結果をフィルタリングすることもできます。

C/B < 10% 
C/B < .1  (convert percentage to decimal) 
C < .1B (multiply both sides by B) 
10C < B  (multiply both sides by 10) 

あなたも、あなたが戻りたいパーセントの量のための変数に取るために新しいストアドプロシージャを記述することができます。

ところで...これは私がCOLC/COLB < 10%を変換する方法です。 where句はWHERE(colC * @percentage)になります。< colB

+0

私は問題が保存されていることだと思いますプロシージャーは変更できないため、WHERE句を直接結果に適用することはできません。 –

+0

いい視点ね。そうであれば、あなたのソリューションは機能します。彼が新しいストアドプロシージャを書くことができるなら、彼はこのソリューションを使うことができます。 – Narnian

+0

私はcolC * 10トリックが好きです。さまざまなデータ型の問題をうまく回避します。 –

1

ここでの問題は、インラインSELECT文を使用してストアドプロシージャの結果を取得できないことです。正しい?言い換えれば、あなたは、この文脈では、テーブルのようなストアドプロシージャを扱うことができないため、

SELECT * FROM myProc WHERE (colcC/colB) < .1 

しかし、動作しませんを言うことができるようにしたいと思います。

1)このように、一時テーブルにプロシージャの結果をコピーします:

INSERT INTO #myTempTable EXEC myProcedure 

この問題に対する最善の解決策は、2つのことを行い、新しいストアドプロシージャを作成することです。

SELECT * FROM #myTempTable WHERE (colC * 10) < colB 

(NarnianからCOLC * 10トリックを借用)

01:)このように、あなたが興味を持っている行を選択します

幸運を祈る!

+0

ありがとうございます。私はこれを使用してチェックします。 – sreeprasad