2

我需要在 WHERE 子句中调用存储过程来进行 SELECT。应该是这样的......

SELECT distinct top 10 ix, d.droit FROM v_droit d, v_info i WHERE d.nomdroit='yy' AND i.id<>2 AND (select val from (exec up_droits(ix, d.droit)) <>3

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

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

4

6 回答 6

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 需要查询中的 ix 和 d.droit 参数。这表明您的存储过程可能应该是一个视图或表值函数。

于 2009-06-03T07:56:27.233 回答
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())
于 2009-06-03T07:53:33.307 回答
1

你不能。WHERE 子句的内容必须是搜索表达式

于 2009-06-03T07:43:41.830 回答
0

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

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

于 2009-06-03T07:48:39.183 回答
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

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

如果一开始你没有成功,围绕它编写代码^^

于 2009-06-03T07:53:29.843 回答
0

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

在 select 或 where 子句中具有函数的 Select 也是如此。

尝试考虑您的数据集,而不是如何解决它的程序方法。

于 2009-09-01T22:52:40.737 回答