【问题标题】:How to execute a stored procedure within a SELECT clause in SQL Server [duplicate]如何在 SQL Server 的 SELECT 子句中执行存储过程 [重复]
【发布时间】:2016-11-15 11:43:37
【问题描述】:

我有这样的场景。我需要在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。
  • 我有一个很长的 CTE 链,在其中一个 CTE 中我正在尝试实现此功能....

标签: sql sql-server tsql


【解决方案1】:

您无法在 select 中执行存储过程。您正在寻找的是一个标量值函数/表值函数,如下所示

--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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多