我正在努力弄清楚如何使用If / Then / Else方案进行更新。游标正在抓取select语句中的记录,然后将它们与链接服务器中的不同表进行比较。然后,如果找到匹配的记录,则从光标更新计数。如果它没有找到匹配的记录,则将该行插入表中。
光标位于下方,我当前的更新命令仅用于更新记录找到匹配的计数。
DECLARE @cono INT
DECLARE @repno NVARCHAR(10)
DECLARE @date DATETIME
DECLARE @count INT
DECLARE cur CURSOR FOR
SELECT '1' AS PPCONO,
b.new_SalesrepId AS PPREP1,
MAX(CONVERT(VARCHAR(8), (d.ScheduledStart - c.TimeZoneBias / CAST(24 * 60 AS FLOAT)), 112)) AS PPDATE,
COUNT(b.new_SalesrepId) AS PPCOUNT,
MAX(CONVERT(VARCHAR(8), (a.ActualEnd - c.TimeZoneBias / CAST(24 * 60 AS FLOAT)), 112)) AS ClosedOn
FROM ActivityPointerBase AS a
join SystemUserExtensionBase AS b ON b.SystemUserId = a.OwnerId
join UserSettingsBase AS c ON c.SystemUserId = b.SystemUserId
join ActivityPartyBase AS d ON d.ActivityId = a.ActivityId
WHERE b.new_SalesrepId <> '99999999'
and a.ActivityTypeCode = '4201'
and b.new_SalesrepId is not NULL
and a.StateCode = '1'
and d.ParticipationTypeMask = '9'
and CONVERT(varchar(8), a.ActualEnd - c.TimeZoneBias / cast(24 * 60 as float), 112) >= dateadd(day,datediff(day,1,CONVERT(varchar(8), GetDate(), 112)),0)
and CONVERT(varchar(8), a.ActualEnd - c.TimeZoneBias / cast(24 * 60 as float), 112) < dateadd(day,datediff(day,0,CONVERT(varchar(8), GetDate(), 112)),0)
/* and CONVERT(VARCHAR(8), a.ActualEnd - c.TimeZoneBias / CAST(24 * 60 AS FLOAT), 112) < CONVERT(VARCHAR(8), GETDATE(), 112) */
group by b.new_SalesrepId,
CONVERT(varchar(8), (d.ScheduledStart - c.TimeZoneBias / cast(24 * 60 as float)), 112)
order by b.new_SalesrepId ASC;
FETCH NEXT FROM cur INTO @cono, @repno, @date, @count
WHILE (@@FETCH_STATUS=0)
BEGIN
UPDATE [AS400].S062f7ar.APLUS83MDS.PEPAPPTS01
SET PPCOUNT = PPCOUNT + @count
WHERE PPCONO = @cono
and PPREP1 = @repno
and PPDATE = @date
FETCH NEXT FROM cur INTO @cono, @repno, @date, @count
END
CLOSE cur
DEALLOCATE cur
不确定如何在SQL中完成IF / Then / Else场景。我做了一些研究,也许使用Case是要走的路,但是你能用Update命令吗?我在SQL 2008上。
答案 0 :(得分:1)
您可以检查记录是否存在,如果是,则执行更新,否则执行插入。例如:
DECLARE @cono INT
DECLARE @repno NVARCHAR(10)
DECLARE @date DATETIME
DECLARE @count INT
DECLARE @closedOn DATETIME
DECLARE cur CURSOR FOR
SELECT '1' AS PPCONO,
b.new_SalesrepId AS PPREP1,
MAX(CONVERT(VARCHAR(8), (d.ScheduledStart - c.TimeZoneBias / CAST(24 * 60 AS FLOAT)), 112)) AS PPDATE,
COUNT(b.new_SalesrepId) AS PPCOUNT,
MAX(CONVERT(VARCHAR(8), (a.ActualEnd - c.TimeZoneBias / CAST(24 * 60 AS FLOAT)), 112)) AS ClosedOn
FROM ActivityPointerBase AS a
join SystemUserExtensionBase AS b ON b.SystemUserId = a.OwnerId
join UserSettingsBase AS c ON c.SystemUserId = b.SystemUserId
join ActivityPartyBase AS d ON d.ActivityId = a.ActivityId
WHERE b.new_SalesrepId <> '99999999'
and a.ActivityTypeCode = '4201'
and b.new_SalesrepId is not NULL
and a.StateCode = '1'
and d.ParticipationTypeMask = '9'
and CONVERT(varchar(8), a.ActualEnd - c.TimeZoneBias / cast(24 * 60 as float), 112) >= dateadd(day,datediff(day,1,CONVERT(varchar(8), GetDate(), 112)),0)
and CONVERT(varchar(8), a.ActualEnd - c.TimeZoneBias / cast(24 * 60 as float), 112) < dateadd(day,datediff(day,0,CONVERT(varchar(8), GetDate(), 112)),0)
/* and CONVERT(VARCHAR(8), a.ActualEnd - c.TimeZoneBias / CAST(24 * 60 AS FLOAT), 112) < CONVERT(VARCHAR(8), GETDATE(), 112) */
group by b.new_SalesrepId,
CONVERT(varchar(8), (d.ScheduledStart - c.TimeZoneBias / cast(24 * 60 as float)), 112)
order by b.new_SalesrepId ASC;
OPEN cur;
FETCH NEXT FROM cur INTO @cono, @repno, @date, @count, @closedOn
WHILE (@@FETCH_STATUS=0)
BEGIN
IF EXISTS (SELECT 1 FROM [AS400].S062f7ar.APLUS83MDS.PEPAPPTS01 WHERE PPCONO = @cono and PPREP1 = @repno and PPDATE = @date)
BEGIN
UPDATE [AS400].S062f7ar.APLUS83MDS.PEPAPPTS01
SET PPCOUNT = PPCOUNT + @count
WHERE PPCONO = @cono
and PPREP1 = @repno
and PPDATE = @date
END
ELSE
BEGIN
INSERT INTO [AS400].S062f7ar.APLUS83MDS.PEPAPPTS01
(PPCOUNT, PPCONO, PPREP1, PPDATE)
VALUES
(@count, @cono, @repno, @date)
END
FETCH NEXT FROM cur INTO @cono, @repno, @date, @count
END
CLOSE cur
DEALLOCATE cur
答案 1 :(得分:1)
您可以使用根据条件
更新或插入的MERGE MERGE [AS400].S062f7ar.APLUS83MDS.PE. PAPPTS01 T
USING ( SELECT @cono as cono, @repno as repno, @date as date ) S
ON
T.PPCONO = S.cono
and T.PPREP1 = S.repno
and T.PPDATE = S.date
WHEN MATCHED
SET T.PPCOUNT = T.PPCOUNT + @count
WHEN NOT MATCHED
INSERT (PPCONO, PPREP1, PPDATE) VALUES ( S.cono, S.repno,S.date)