2011-07-27 92 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子句這樣的:

WHERE (colC * 10) < ColB 

這將阻止您不必做百分比和東西。

您可能只是在代碼中篩選結果。

BTW ...我這是怎麼轉換COLC/COLB < 10%:

C/B < 10% 
C/B < .1  (convert percentage to decimal) 
C < .1B (multiply both sides by B) 
10C < B  (multiply both sides by 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 

(從納尼亞借COLC * 10招)

01。

祝你好運!

+0

謝謝大家。我將使用這個並檢查。 – sreeprasad