19

如何在常规 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

等等

4

2 回答 2

25

不,您需要使用临时表

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

INSERT INTO #results
   EXEC YourProcedure @parma...

然后你可以加入它

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

如果您不知道过程中的列和数据类型,您可以使用这个出色的答案:将存储过程的结果插入临时表

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

于 2010-04-01T19:40:55.853 回答
4

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

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

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

于 2010-04-01T20:46:23.267 回答