所以我花了很长时间来讨论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'?
答案 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