如何将SQL动态查询结果存入变量以在存储过程while循环中使用
解决方案
你可以使用sp_executesql系统存储过程替代直接EXEC执行动态SQL,它支持输入输出参数传递,可以把动态查询的结果直接赋值给外部变量,后续直接在while循环或其他存储过程逻辑中调用即可。
修改后的完整可运行代码如下:
declare @DynQry nvarchar(max) -- sp_executesql要求动态SQL参数为nvarchar类型,这里要改类型 declare @rotpos int = 2 declare @rotID int = 3 declare @ResultShiftID int -- 用来接收动态SQL返回结果的自定义变量 -- 构造动态SQL,用占位符替代参数,同时预留输出变量的赋值位置 set @DynQry = N' select @OutputShiftID = ShiftID' + CAST(@rotpos as nvarchar(10)) + N' from dbo.Rotations where RotationID = @InputRotID; ' -- 执行sp_executesql,依次传入动态SQL语句、参数定义列表、参数赋值 exec sp_executesql @DynQry, N'@InputRotID int, @OutputShiftID int output', -- 所有用到的参数的类型定义 @InputRotID = @rotID, -- 给输入参数传值 @OutputShiftID = @ResultShiftID output -- 把输出值赋值给外部变量,必须加output标识 -- 此时@ResultShiftID已经拿到查询结果,可直接在后续逻辑中使用 -- 可选执行下面的语句验证结果是否正确 select @ResultShiftID as ReturnedShiftID
注意事项
- 动态SQL变量必须为
nvarchar类型,否则sp_executesql会执行报错 - 输出参数在参数定义、传值两个位置都要加上
output关键字,否则无法正常把值回传给外部变量 - 把固定查询条件做成
sp_executesql的输入参数,比直接拼接字符串更安全,可避免SQL注入风险
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

