2009-06-03 103 views
2

我需要在WHERE子句中调用存储过程来进行SELECT。 它应该是类似的东西....SQL Server 2005:从WHERE子句中调用存储过程

SELECT DISTINCT顶部10 IX,d.droit FROM v_droit d,v_info我 WHERE d.nomdroit = 'YY' AND i.id <> 2 AND (请从VAL(EXEC up_droits(九,d.droit))<> 3

但它不工作... 任何想法?

不要说用一个函数代替存储过程因为不可能在一个函数中使用现有的代码,所以这个函数不是一个有效的选项,我是真实的ly需要能够使用存储过程

+1

请更新问题(标题,说明和标记),以具体说明您正在讨论的特定SQL Server。这方面存在显着差异。 – bignose 2009-06-03 07:42:39

+0

假设你的意思是在哪里,而不是在(如问题主体中所述)。 – 2009-06-03 07:44:54

+0

你的存储过程是做什么的? – 2009-06-03 07:45:56

回答

6

这是通过首先执行存储过程,捕获输出到#temp表或一个@tabel变量,然后运行你对表查询来实现。类似这样的:

declare @droits_table (val ,...); 
insert into @droits_table 
exec up_droits(param, param); 
SELECT distinct top 10 i.x, d.droit FROM v_droit d, v_info i WHERE d.nomdroit='yy' AND i.id<>2 AND (select val from @droits) <>3 

当然这不适合你,因为up_droits需要查询中的i.x和d.droit参数。这表明你的存储过程应该可能是一个视图或表值函数。

0

是代码不能作为函数工作的原因,因为它修改了一些数据?如果是这样,那么你运气不好,在where子句中使用的函数必须是不可变的。

如果存储过程不修改任何数据,您可能可以将它包装在一个函数中。

0

如果你在SQL Server上,我不认为你可以做你的建议。

但你可以做的一件事就是构建动态查询,但要小心,因为它们会打开许多​​有趣的问题列表。

的语法是:

EXEC @<query>

但anotherthing你可以做的,这是你可能要好得多,是使up_droits功能提供一个临时表中它的结果,如果选择到一个#table它是暂时的你的函数/程序范围的持续时间


declare procedure up_droits() as 
select val .. into #temp 

所以,你要做的就是创建一个过程


create procedure Top10FromDroit 
begin 
    exec up_droits 
    SELECT distinct top 10 i.x, d.droit FROM v_droit d, v_info i WHERE d.nomdroit='yy' AND i.id2 AND (select val from (#temp) 3 

希望这会给你你想要达到的结果。

如果一开始你没有成功,它周围的代码^^

4

很抱歉,但,使之成为表值函数,而不是存储过程。

例如:

Scalar - SELECT id, name FROM test WHERE id < (SELECT dbo.mytestfunction()) 
Table - SELECT id, name FROM test WHERE id = (SELECT col1 from dbo.mytestfunction()) 
0

是否有人可以解释在存储过程中执行动态SQl的原因。当你需要他们时,我知道的情况非常少 - 但是真的很少。 99.9%(或1000个中的999个)执行字符串可以被重写为具有参数的普通sql语句。

与在select或where子句中具有函数的选择一样。

试着想想你的数据集,而不是关于如何解决它的程序方法。