使用If / Then / Else更新Cursor SQL语句

时间:2014-10-05 18:07:13

标签: sql sql-server sql-server-2008 cursor sql-update

我正在努力弄清楚如何使用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上。

2 个答案:

答案 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)