在 T-SQL 中结合存储过程和查询
Posted
技术标签:
【中文标题】在 T-SQL 中结合存储过程和查询【英文标题】:Combine stored procedure and query in 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:如果你能按照我上面描述的想法重写一下来增加感觉就好了 他在问一个常见的问题:有没有办法将存储过程的输出用作子查询。他也在反问:有没有办法将子查询的结果作为参数传递给存储过程。 【参考方案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 - 没有重复。
【讨论】:
以上是关于在 T-SQL 中结合存储过程和查询的主要内容,如果未能解决你的问题,请参考以下文章