如何在SQL Server中的SELECT子句中执行存储过程

4
我有一个这样的情况。我需要在SELECT语句中执行一个存储过程,该存储过程的输入参数来自于在SELECT语句中使用的表格。此外,以下有多个函数调用,它们使用了SELECT子句中使用的表格中的输入,但由于某种原因它无法正常工作。下面是我正在尝试实现的代码示例。
代码示例:
SELECT A,
       B,
       dbo.storedproc( function1(A,B),
                       function1(A,B),
                       function2(B,C),
                       D
                      ) AS newcol,               
       D
 FROM Table;

错误 :-

消息 4121,级别 16,状态 1,过程 XYZ,行 34


找不到列“schemaname”或用户定义的函数或聚合“schemaname.dbo.storedproc”,或名称不明确。

注意 :我正在使用基于集合的方法为输入表中的所有行调用此存储过程。


不,你不能这样做。它应该是一个标量函数或动态SQL。 - Ivan Starostin
我有一条非常长的CTE链,在其中一个CTE中,我正在尝试实现这个功能... - Teja
1个回答

4

你无法在选择语句中执行存储过程。你需要使用标量值函数或表值函数,如下所示:

--scalar valued function
    create function dbo.test( int a)
    returns int
    as
    begin
    return someval of int
    end

现在您可以像下面这样在选择中调用上述内容
select a,b,dbo.test(a) from t

如果您的存储过程返回多个值,您可以创建表值函数并使用交叉/外部应用程序。
---表值函数示例
CREATE FUNCTION dbo.ivf
     ( @a int,
       @b int )
RETURNS table
AS
RETURN (
        SELECT a,b from table
       )

现在您可以像下面这样调用它。
select a,b from table t1
cross apply
(select * from dbo.ivf(a,b))c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接