2011-07-27 60 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