下面的代码显然是错误的,但是您必须原谅我以前没有真正在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参数进行自我连接,其中一个是要复制的年份,另一个是所有这些信息将被复制到。如果需要其他任何条件来完全回答这个问题,请告诉我。
答案 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
编辑:这是我的“额外”猜测,但否则,他们需要更多地解释并显示出更好的预期结果:
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;
ALTER TABLE TSCHEDDOW ADD NewSysNr int;
....
UPDATE TS
SET newSysNr = T.newSysNr
FROM TSCHEDDOW TS
JOIN #temp T ON TS.SysNr = T.oldSysNr;