如何在常规 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
等等
如何在常规 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
等等
不,您需要使用临时表
create table #results (col1 int, col2 varchar(5) ...)
INSERT INTO #results
EXEC YourProcedure @parma...
然后你可以加入它
SELECT
*
FROM YourTable y
JOIN #results r ON ...
....
如果您不知道过程中的列和数据类型,您可以使用这个出色的答案:将存储过程的结果插入临时表
简而言之,它用于OPENROWSET
将存储过程执行到动态创建的#temp 表中,而无需命名和知道所有列的类型。
如果您的 SP 可以重写为值 UDF 的内联表,则这些通常执行得非常好并且等效于参数化视图。ITVF 可用于任何使用表格或视图的地方。
如果您的 SP 不能用作内联 TVF(需要进行局部变量操作),它可能会用作多语句 TVF(包含 BEGIN/END),这可能会或可能不会表现不佳,具体取决于您必须做什么。
在您的 SP 变成 UDF 后,您仍然可以从您的 SP (SELECT* FROM udf(params)) 或其他地方调用 UDF,它可用于连接等,因此您的所有代码都在 UDF 内 - 不复制。