SQL Server 2005:从WHERE子句调用存储过程

时间:2009-06-03 07:38:52

标签: sql-server-2005 stored-procedures where-clause

我需要在WHERE子句中调用存储过程来创建SELECT。 它应该是那样的......

SELECT distinct top 10 i.x,d.droit FROM v_droit d,v_info i 在哪里d.nomdroit ='yy'       和i.id<> 2       AND(从(exec up_droits(i.x,d.droit)中选择val)<> 3

但它不起作用...... 有什么想法吗?

不要说用函数替换存储过程,因为无法使用函数中的现有代码。所以该功能不是一个有效的选项。我真的需要能够使用存储过程

6 个答案:

答案 0 :(得分: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参数。这表明您的存储过程可能应该是视图或表值函数。

答案 1 :(得分: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())

答案 2 :(得分:1)

你做不到。 WHERE子句的内容必须是search expression

答案 3 :(得分:0)

代码是否因为修改某些数据而无法正常工作?如果是这样,那么你运气不好,where子句必须是不可变的函数。

如果存储过程不修改任何数据,您可以将其包装在函数内。

答案 4 :(得分:0)

如果您使用的是SQL Server,我认为您不能按照您的建议行事。

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

语法为:

EXEC @<query>

但你能做的另一件事,就是让你更好,就是让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

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

如果一开始你没有成功,请围绕它进行编码^^

答案 5 :(得分:0)

你们中的任何人都可以解释在存储过程中执行动态SQl的原因。当你需要它时,我知道很少的情况 - 但实际上很少。 99.9%(或1000个中的999个)执行字符串可以用带参数的普通sql语句重写。

对于在select或where子句中包含函数的Selects,情况也是如此。

尝试考虑一组数据,而不是解决方法如何解决。