我需要在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
但它不起作用...... 有什么想法吗?
不要说用函数替换存储过程,因为无法使用函数中的现有代码。所以该功能不是一个有效的选项。我真的需要能够使用存储过程
答案 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,情况也是如此。
尝试考虑一组数据,而不是解决方法如何解决。