SQL Update从查询中更新多行

时间:2014-09-10 12:31:17

标签: sql-server-2008 sql-update

我已经编写了2个查询,我需要考虑将它们组合成我认为必须是游标的内容。第一个查询看起来像这样 -

DECLARE @Date DATETIME
SET @Date = '12-July-2014'

SELECT  Date AS SaturdayDate
          , DayOfWeek

 FROM (
SELECT DATE
          , DATENAME(DW,DATE) as DayOfWeek
          , ROW_NUMBER() OVER (ORDER BY Date) AS rownum
     FROM tblCalender
     WHERE DATENAME(DW,DATE) = 'Saturday'
          AND Date > @Date
          ) AS t
          WHERE t.rownum % 4 = 0
                AND DATEPART(YEAR, Date) = DATEPART(Year, GETDATE())

每年第4个星期六返回7月12日剩余的一年 -

SaturdayDate            |DayOfWeek
2014-08-09 00:00:00.000 |Saturday
2014-09-06 00:00:00.000 |Saturday
2014-10-04 00:00:00.000 |Saturday
2014-11-01 00:00:00.000 |Saturday
2014-11-29 00:00:00.000 |Saturday
2014-12-27 00:00:00.000 |Saturday

这非常适合我的需要,然后我需要使用上面的结果作为@SaturdayDate参数运行更新查询(需要它循环并更新每条记录)

UPDATE    dbo.tblStaffRota
SET              StartTime = '11:00:00'
WHERE     (EmployeeID IN ('JJJ','HSW', 'GPH', 'DVD')) 
                AND (StartTime = '10:30:00')            
                AND (Date BETWEEN @SaturdayDate - 6 AND @SaturdayDate)

因此,更新查询将循环显示第一个查询的结果,使用新的开始时间更新每个日期,不确定如何使用此进程以及我发现的所有答案都没有安静帮助。希望这很清楚。感谢

*附加说明 - 更新需要查看上周出现的每个星期六的日期,并随着开始时间的变化而变化。

正在使用的表格示例。 enter image description here

如果星期六在列表中,更新将在18日和19日更改开始时间。

1 个答案:

答案 0 :(得分:1)

看起来你需要类似的东西(注意:下面的脚本尚未经过测试)..

根据发布的样本数据

修改

    DECLARE @Date DATETIME
SET @Date = '12-July-2014'


UPDATE    STAFFROTA
SET              StartTime = '11:00:00'
FROM dbo.tblStaffRota STAFFROTA 
    INNER JOIN
    (
            SELECT DATEADD(d, -6, Date) AS SaturdayDateStart,  Date AS SaturdayDateEnd
                  , DayOfWeek
        FROM (
        SELECT DATE
                  , DATENAME(DW,DATE) as DayOfWeek
                  , ROW_NUMBER() OVER (ORDER BY Date) AS rownum
             FROM tblCalender
             WHERE DATENAME(DW,DATE) = 'Saturday'
                  AND Date > @Date
                  ) AS t
                  WHERE t.rownum % 4 = 0
                        AND DATEPART(YEAR, Date) = DATEPART(Year, GETDATE())

    ) SAT
    ON STARFFROTA.[Date] BETWEEN SAT.SaturdayDateStart AND SAT.SaturdayDateEnd
WHERE     (STARFFROTA.EmployeeID IN ('JJJ','HSW', 'GPH', 'DVD')) 
                AND (STARFFROTA.StartTime = '10:30:00')