在 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 中结合存储过程和查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQL Server 2008下轻松调试T-SQL语句和存储过程

sql 视图 存储过程 的区别?

T-SQL分页功能存储过程

SQL Server——存储过程

SQL server T-SQL存储过程

SQL Server T—SQL 存储过程 触发器