根据在临时表上执行的循环,插入新的Real表行

时间:2019-03-13 19:33:47

标签: sql sql-server loops

下面的代码显然是错误的,但是您必须原谅我以前没有真正在SQL中完成循环。

While (Select oldSysNr, DoW.DoWC, DoW.WorkStart, DoW.WorkEnd, DoW.ContractHours From #TempTable 
Join AppData.TSCHEDDOW as DoW 
On DoW.ShiftSystemNumber = oldSysNr)


    Insert into AppData.TSCHEDDOW 
    (
        #TempTable.newSysNr,
        DoWC,
        WorkStart,
        WorkEnd,
        ContractHours
    )
    Select
    #TempTable.newSysNr,
    DoWC,
    WorkStart,
    WorkEnd,
    ContractHours
    From AppData.TSCHED 
End;

预期的结果是,这将循环遍历tempTable的oldSysNr,并且当它与AppData.TSCHEDDOW SysNr匹配时,它将在AppData.TSCHED中插入新行,只有newSysNr是会更改的属性,同时保留旧行。

这是预期的结果:

AppData.TSCHEDDOW
    SysNr   DoWC   WorkStart   WorkEnd  ContractHours
    --------------------------------------------------
    24      1        12:00      8:00         8
    25      2        12:00      8:00         8
    26      2        9:00       6:00         8
    27      5        7:00       3:00         8
    54      1        12:00      8:00         8
    55      2        12:00      8:00         8
    56      2        9:00       6:00         8
    57      5        7:00       3:00         8

我现在的问题是,在此循环中我在做什么错,我应该怎么做?对于此问题,我能提供的任何帮助和资源将不胜感激。

以下是示例数据:

#TempTable
oldSysNr     newSysNr
------------------------
24            54
25            55
26            56
27            57

AppData.TSCHEDDOW
        SysNr   DoWC   WorkStart   WorkEnd  ContractHours
        --------------------------------------------------

        24      1        12:00      8:00         8
        25      2        12:00      8:00         8
        26      2        9:00       6:00         8
        27      5        7:00       3:00         8

填充newSysNr的信息来自与oldSysNr相同的表,这是创建一个临时表的结果,该临时表已根据year参数进行自我连接,其中一个是要复制的年份,另一个是所有这些信息将被复制到。如果需要其他任何条件来完全回答这个问题,请告诉我。

1 个答案:

答案 0 :(得分:1)

提供了您所实际描述的内容,我想您所需要的只是一个简单的UPDATE语句:

CREATE TABLE TSCHEDDOW (SysNr int,
                        DoWC int,
                        WorkStart time,
                        WorkEnd time,
                        ContractHours int)
INSERT INTO TSCHEDDOW
VALUES(24,1,'12:00','8:00',8),
      (25,2,'12:00','8:00',8),
      (26,2,'9:00','6:00',8),
      (27,5,'7:00','3:00',8)

CREATE TABLE #temp (oldSysNr int,newSysNr int)
INSERT INTO #temp
VALUES(24,54),
      (25,55),
      (26,56),
      (27,57);

UPDATE TS
SET SysNr = T.newSysNr
FROM TSCHEDDOW TS
     JOIN #temp T ON TS.SysNr = T.oldSysNr

DB<>Fiddle

编辑:这是我的“额外”猜测,但否则,他们需要更多地解释并显示出更好的预期结果:

INSERT INTO TSCHEDDOW (SysNr,DoWC, WorkStart, WorkEnd, ContractHours)
SELECT T.newSysNr,
       TS.DoWC,
       TS.WorkStart,
       TS.WorkEnd,
       TS.ContractHours
FROM TSCHEDDOW TS
     JOIN #temp T ON TS.SysNr = T.oldSysNr;

DB<>Fiddle

ALTER TABLE TSCHEDDOW ADD NewSysNr int;

....

UPDATE TS
SET newSysNr = T.newSysNr
FROM TSCHEDDOW TS
     JOIN #temp T ON TS.SysNr = T.oldSysNr;

DB<>Fiddle