Ωme*_*Man 2 sql-server dynamic-sql t-sql sql-server-2012
SQL 中的一个业务流程可以为每个操作生成一个变量1-N 次调用存储过程,其目的是插入与主流程相关的数据。
如何从选择执行多行生成的 sql 或者有没有办法从选择调用存储过程?
这一步之前的过程是涉及到业务逻辑和数据驱动的操作,对相关的FK连接表做了后续的插入。
在需要调用存储过程的那一点上,它已经准备好在表变量中处理数据。调用存储过程的步骤(过程中的逻辑)是一个涉及过程,在存储过程中是有意义的,并且不能复制到现有过程中。
由Select.
SELECT 'EXEC [sim].[ROI_Save] ' + CONVERT(varchar(6), VSL.PathId) + ', '
+ Convert(varchar(6), @ROIResultId) + ', '
+ CONVERT(varchar(6), RT.routeTypeResultId) + ', '
+ CONVERT(varchar(6), RT.ROI_RouteTypeId) + '; '
FROM @routeResultIds RT
JOIN sim.ROI_Result_Vehicle VSL ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId
Run Code Online (Sandbox Code Playgroud)
结果
是否连接结果并调用Exec?
虽然我更喜欢使用强类型参数生成真正的动态 SQL 语句,但连接在这里可能没问题,因为正确的方法会麻烦得多。我这样做,不过,喜欢sp_executesql过EXEC(),始终。
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql = @sql + N'EXEC [sim].[ROI_Save] '
+ CONVERT(varchar(6), VSL.PathId) + N', '
+ CONVERT(varchar(6), @ROIResultId) + N', '
+ CONVERT(varchar(6), RT.routeTypeResultId) + N', '
+ CONVERT(varchar(6), RT.ROI_RouteTypeId) + N'; '
FROM @routeResultIds AS RT
JOIN sim.ROI_Result_Vehicle AS VSL
ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId;
EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)
我仍然不喜欢过程的参数没有命名,如果你的任何参数值是字符串或日期,单引号的组合很快就会变得非常烦人。