在SQL Server表

时间:2017-05-31 21:39:59

标签: sql sql-server sql-server-2008 stored-procedures cursor

所以我花了很长时间来讨论Stack Overflow,想要制作一些SQL,它会在视图中填充一个项目延迟工作天数。

视图连接来自MS SQL Server(2008)上两个本地表的数据,我已经编写了存储过程来计算两天之间的工作日,调用方式为:

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

但是我不确定如何遍历视图中的每条记录,因为需要对表中的每个条目进行此操作。我的表中的相关字段是startDate,endDate,我将使用endDate和startDate作为参数,使用上面的存储过程的结果填充最终字段(daysLate)。我在网上找到了一些使用cursor命令遍历表的建议,这将是我想要运行的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很新,所以我知道我想要运行的伪代码就像每个循环一样,在我看来我看起来像:

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

      FETCH NEXT FROM @MyCursor 
      INTO @MyField 
    END; 

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

1 个答案:

答案 0 :(得分:1)

你有没有试过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