如何将带多参数的存储过程usp_stored_proc1返回值传入usp_stored_proc2
正确实现方式
核心原理
存储过程返回的结果集无法直接作为另一个存储过程的入参使用,也不支持直接嵌套存储过程作为参数传递,你需要先中转存储过程1返回的uniqueidentifier类型值,再传入存储过程2。
方案1:无需修改现有存储过程(表变量中转)
如果不能调整usp_stored_proc1的定义,使用表变量承接它返回的查询结果,再提取值传入第二个存储过程:
-- 1. 声明变量承接最终返回值,以及表变量中转存储过程结果集 DECLARE @proc1Result UNIQUEIDENTIFIER DECLARE @tempResult TABLE (column1 UNIQUEIDENTIFIER) -- 2. 调用存储过程1,把返回的结果集插入表变量 INSERT INTO @tempResult(column1) EXEC usp_stored_proc1 'Test1', 'Para1', 'Para2' -- 3. 从表变量提取结果赋值给标量变量 SELECT @proc1Result = column1 FROM @tempResult -- 4. 调用存储过程2,传入变量作为参数 EXEC usp_stored_proc2 @proc1Result, 'Para3', 'Para4'
方案2:修改存储过程1用输出参数返回(更高效)
如果有权限调整usp_stored_proc1的定义,建议改用OUTPUT输出参数返回值,无需中转表变量,性能和可读性更好:
调整后的usp_stored_proc1定义参考
ALTER PROCEDURE usp_stored_proc1 @para1 VARCHAR(100), -- 替换为你原有的参数定义 @para2 VARCHAR(100), @para3 VARCHAR(100), @column1Output UNIQUEIDENTIFIER OUTPUT -- 新增输出参数 AS BEGIN -- 原有逻辑省略,最后直接赋值给输出参数,不需要SELECT返回 SET @column1Output = -- 你原本要SELECT返回的column1值 END
调用代码
DECLARE @proc1Result UNIQUEIDENTIFIER -- 调用存储过程1,通过输出参数拿到返回值 EXEC usp_stored_proc1 'Test1', 'Para1', 'Para2', @column1Output = @proc1Result OUTPUT -- 直接传入存储过程2 EXEC usp_stored_proc2 @proc1Result, 'Para3', 'Para4'
原有写法失败原因
- 第一种写法:
EXEC的入参只能是常量、变量、标量函数,不能直接写SELECT查询语句,且第一个存储过程返回的结果集和第二个存储过程的调用上下文完全隔离,无法直接引用。 - 第二种写法:SQL Server不支持直接将存储过程名作为值传递给另一个存储过程的入参,没有嵌套调用存储过程作为参数的语法。
内容的提问来源于stack exchange,提问作者Odie
相关产品推荐
相关产品推荐

