Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2005:从WHERE子句调用存储过程_Sql Server 2005_Stored Procedures_Where Clause - Fatal编程技术网

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

Sql server 2005 SQL Server 2005:从WHERE子句调用存储过程,sql-server-2005,stored-procedures,where-clause,Sql Server 2005,Stored Procedures,Where Clause,我需要通过调用WHERE子句中的存储过程来进行选择。 应该是这样的 选择不同的前10个i.x、d.droit 从v_droit d,v_info i 其中d.nomdroit='yy' 和i.id2 并从exec up_droitsi.x,d.droit 3中选择val 但它不起作用。。。 有什么想法吗 不要说用函数替换存储过程,因为不可能在函数中使用现有代码。因此,该函数不是有效的选项。我真的需要能够使用存储过程,但你不能。WHERE子句的内容必须是a。是代码不能作为函数工作的原因,因为它修改

我需要通过调用WHERE子句中的存储过程来进行选择。 应该是这样的

选择不同的前10个i.x、d.droit 从v_droit d,v_info i 其中d.nomdroit='yy' 和i.id2 并从exec up_droitsi.x,d.droit 3中选择val

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


不要说用函数替换存储过程,因为不可能在函数中使用现有代码。因此,该函数不是有效的选项。我真的需要能够使用存储过程,但你不能。WHERE子句的内容必须是a。

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


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

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

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

语法是:

EXEC @<query>
所以你要做的就是创建一个过程


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
希望这能给你带来你想要的结果

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

抱歉,但是,请将其设置为表值函数,而不是存储过程

例如:


这是通过首先执行存储过程,将输出捕获到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参数。这表明您的存储过程可能应该是一个视图或表值函数。

有人能解释一下在存储过程中执行动态SQl的原因吗。当你需要的时候,我知道的情况很少,但实际上很少。1000个执行字符串中99.9%或999个可以重写为带参数的普通sql语句

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


尽量考虑您的数据集,而不是如何解决它的过程方法。

请更新问题标题、说明和标记,以明确您所谈论的特定SQL server。在这方面有很大的不同。假设您指的是何处,而不是问题正文中提到的。您的存储过程是做什么的?它有一些复杂的算法来创建一个查询,执行该查询以验证某些访问权限。它还使用存储过程sp_executesqlNo,它不修改数据,但它必须执行动态构造的查询,因此必须使用sp_executesql执行。此外,此存储过程调用另一个具有3个输出参数的存储过程:如果您有e。G在一个表中,一个select应该返回的表的名称和该表的列—您希望在SQL中实现逻辑,如e。G有几个应用程序访问动态结果集。@对于递归树遍历,您不需要动态SQL。您可以使用递归CTE:
Scalar - SELECT id, name FROM test WHERE id < (SELECT dbo.mytestfunction())
Table - SELECT id, name FROM test WHERE id = (SELECT col1 from dbo.mytestfunction())
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