在SQL Server中的IN子句中调用存储过程?

在SQL Server中的IN子句中调用存储过程?,sql,stored-procedures,Sql,Stored Procedures,可以在IN子句中调用存储过程吗 Select field0, field2 FROM Table WHERE field0 in (exec storedproc) 之所以使用存储过程是因为它的复杂性存储过程不能用于这种情况。但是,回顾一下使用表值函数的可能性,这些函数作为语句中的参数是正确的,您可以使用它们来实现这一点 Select Field0, Field2 From Table Where Field0 in ( SELECT Field0 FROM O

可以在IN子句中调用存储过程吗

Select field0, field2 FROM Table
WHERE field0 in (exec storedproc)

之所以使用存储过程是因为它的复杂性

存储过程不能用于这种情况。但是,回顾一下使用表值函数的可能性,这些函数作为语句中的参数是正确的,您可以使用它们来实现这一点

Select Field0, Field2 From Table
Where Field0 in (
                SELECT Field0 FROM OPENROWSET('SQLNCLI', 
                             'Server=SERVERNAME;Trusted_Connection=yes;',
                            'EXEC StoredProc')
                )
为此,必须在服务器上启用以下选项:

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
如果无法更改这些设置,那么另一个选项(如在注释中与Martin讨论的)是填充临时表

e、 g


要将存储过程的结果插入临时表,临时表的定义必须与存储过程的结果完全匹配。

不能使用存储过程。您需要使用一个返回表的函数。例如:

CREATE FUNCTION myFunction(@arg varchar(30))
RETURNS @myTable table(Value INT)
AS
BEGIN
    insert into @myTable(Value) values (1)       
    RETURN
END
现在,您可以将该函数作为查询的一部分运行:

Select field0, field2 FROM Table
WHERE field0 in (select Value from myFunction('arg'))

+1但这确实会打开一个新的服务器连接。@Martin-是的,确实是这样,我真的想不出任何其他方法来实现这一点吗?除了使用表函数外,我得到的印象是OP并不真的想更改SP。OP还可以添加一个中间表变量并
插入到@t EXEC storedproc
中,然后在
in
子句中使用它。@Barry,它为此声明了某些安全设置。@Barry,非常感谢!我对那些说不可能做到这一点的人感到失望。他们照本宣科,不假思索。+1将存储过程重新分解成TVF对我来说是最好的解决方案。@Barry,谢谢你的帮助formatting@DHN,我从那开始,错误消息“EXEC附近的语法不正确”如果EXEC在没有其他东西的情况下工作,那么就不可能像那样调用存储过程了;o)
Select field0, field2 FROM Table
WHERE field0 in (select Value from myFunction('arg'))