【问题标题】:Combine stored procedure and query in T-SQL在 T-SQL 中结合存储过程和查询
【发布时间】:2011-02-03 12:35:24
【问题描述】:

如何在常规 SQL 查询中结合执行存储过程和使用其结果或参数?

例如,我想做如下的事情:

-- passing result of SELECT to SP
SELECT a, b FROM t
EXEC my_sp a, b

-- passing result of SP to INSERT    
INSERT INTO t
EXEC my_sp a, b

等等

【问题讨论】:

  • 你能改写你的问题吗?目前的形式没有多大意义。
  • @JohnFx:我在询问 SP 和 DML 的所有可能组合。为什么没有意义?
  • 无意冒犯,我只是觉得你的问题的意思在英语翻译有点糟糕时迷失了。
  • @JohnFx:如果你能按照我上面描述的想法重写一下来增加感觉就好了
  • 他在问一个常见的问题:有没有办法将存储过程的输出用作子查询。他也在反问:有没有办法将子查询的结果作为参数传递给存储过程。

标签: sql sql-server tsql stored-procedures dml


【解决方案1】:

不,您需要使用临时表

create table #results (col1 int, col2 varchar(5) ...)

INSERT INTO #results
   EXEC YourProcedure @parma...

那么你就可以加入了

SELECT
    *
    FROM YourTable     y
        JOIN #results  r ON ...
    ....

如果您不知道该过程中的列和数据类型,您可以使用这个出色的答案:Insert results of a stored procedure into a temporary table

简而言之,它使用OPENROWSET 将存储过程执行到动态创建的#temp 表中,无需命名和知道所有列的类型。

【讨论】:

    【解决方案2】:

    如果您的 SP 可以重写为值 UDF 的内联表,则这些通常表现得非常好并且等效于参数化视图。 ITVF 可用于任何使用表格或视图的地方。

    如果您的 SP 不能用作内联 TVF(需要进行局部变量操作),它可能会用作多语句 TVF(包含 BEGIN/END),这可能会或可能不会表现不佳,具体取决于您必须执行的操作做。

    在您的 SP 变成 UDF 后,您仍然可以从您的 SP (SELECT* FROM udf(params)) 或其他地方调用 UDF,它可用于连接等,因此您的所有代码都在UDF - 没有重复。

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2011-09-29
      • 2012-07-15
      • 1970-01-01
      • 2018-10-03
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多