对 SQL 服务器 Table 中的每一行执行存储过程

Executing a stored procedure on every row in a SQL Server Table

所以我花了很多时间在 Stack Overflow 上寻找 SQL 的这一点,它将填充一个字段,以显示项目已经延迟的工作天数。

该视图将来自 MS SQL 服务器 (2008) 上两个本地 table 的数据连接起来,我已经编写了存储过程来计算两天之间的工作日,称为通过:

EXECUTE spWorkDaysLate '01/01/20XX', '01/02/20XX'

但是我不确定如何遍历视图中的每条记录,因为 table 中的每个条目都需要这样做。我的 table 中的相关字段是 startDate、endDate,我将使用 endDate 和 startDate 作为参数,用上面存储过程的结果填充最终字段 (daysLate)。我在网上找到了一些使用游标命令循环遍历 table 的建议,这将是 SQL 我想要 运行:

DECLARE @MyCursor CURSOR;
DECLARE @MyField int;
SET @MyField = 'daysLate' /* Do need to do this, or is the an argument I pass? */

BEGIN
    SET @MyCursor = CURSOR FOR
    select top 1000 daysLate from dbo.vQualityControl


    OPEN @MyCursor 
    FETCH NEXT FROM @MyCursor 
    INTO @MyField

    WHILE @@FETCH_STATUS = 0
    BEGIN
      /*
         YOUR ALGORITHM GOES HERE   
      */

      FETCH NEXT FROM @MyCursor 
      INTO @MyField 
    END; 

    CLOSE @MyCursor ;
    DEALLOCATE @MyCursor;
END;

我是 SQL 的新手,所以我知道我想要 运行 的伪代码类似于 for each 循环,在我看来,它看起来像:

WHILE @@FETCH_STATUS = 0
    BEGIN
      /* Bad code */
      daysLate.Value = EXECUTE spWorkDaysLate @startDate, @endDate;

      FETCH NEXT FROM @MyCursor 
      INTO @MyField 
    END; 

我知道这在语法上是错误的,那么我应该在循环中放置什么,以便字段 'daysLate' 被调用的存储过程的结果填充?

你试过FUNCTION吗,你可以在你的FUNCTION中计算两天之间的工作日。

SELECT *, dbo.fn_WorkDaysLate (startDate, endDate) AS DaysLate FROM dbo.vQualityControl
--OR
UPDATE A
    SET A.DaysLate = dbo.fn_WorkDaysLate (A.startDate, A.endDate)
FROM dbo.vQualityControl A