执行从选择生成的动态 SQL

Ω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

Aar*_*and 5

虽然我更喜欢使用强类型参数生成真正的动态 SQL 语句,但连接在这里可能没问题,因为正确的方法会麻烦得多。我这样做,不过,喜欢sp_executesqlEXEC(),始终。

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)

我仍然不喜欢过程的参数没有命名,如果你的任何参数值是字符串或日期,单引号的组合很快就会变得非常烦人。