2

SQL Server 2008

我有一个表,其中包含 2 个字段
TableA
alterid uniqueidentifier
revnum varchar(50)

另一个表具有与第一个表完全相同的字段
TableB
alterid uniqueidentifier
revnum varchar(50)

我想检查比较 revnum 字段。对于 TableA 的每条记录,我检查 TableB 中是否有记录。如果它存在并且 revnum 字段不同,我将 TableB.revnum 更新为 TebleA.revnum。如果它不存在,那么我将 TableA 中的记录添加到 TableB。

这是代码

    BEGIN
    SET @Prod_curs =CURSOR FOR SELECT s.alterid, s.revnum, r.revnum FROM TableA s LEFT OUTER JOIN
                                TableB r ON s.alterid=r.alterid 
                                WHERE s.revnum<>r.revnum OR r.revnum IS NULL

    OPEN @Prod_curs
    FETCH NEXT FROM @Prod_curs INTO @alterid, @srevnum, @rrevnum

    WHILE @@FETCH_STATUS=0
        BEGIN                           


            IF @rrevnum IS NULL
                BEGIN                                           
                    INSERT INTO TableB (alterid,revnum) VALUES (@alterid,ISNULL(@srevnum,0))

                END
            IF @srevnum<>@rrevnum 
                BEGIN           
                    UPDATE TableB SET revnum=@srevnum WHERE alterid=@alterid    

                END         

            FETCH NEXT FROM @Prod_curs INTO @alterid, @srevnum, @rrevnum        
        END

        CLOSE @Prod_curs;
        DEALLOCATE @Prod_curs;
END

我的代码在一组大约 15000 条记录中运行良好,除了一些奇怪的事情发生的记录。

在 TableA 我有这条记录
alterid revnum
'A770B280-B4DA-4937-9046-B24E60259AB6' '2-414922-1--1-1-2-51-0'

当它存储在 TableB 中时,值是
alterid revnum
'BF18A0EB-A684-486B-B053-55BC2969F1E3' '2-414922-1--1-1-2-51-0'

出于某种原因,alterid 发生了变化,我不知道为什么。

有人可以帮忙吗

4

1 回答 1

0

似乎代码工作正常,它只是在插入/更新后选择您正在执行的操作。我在你的帖子里也有一些不清楚的地方。

“revnum”列是主键还是在 TableB 中对其有唯一约束?

您显示的结果是什么是您用于 TableB 的 select stmt?

是不是类似于“从 revnum=xyz 的 TABLEB 中选择前 1 个 *”?

我在虚拟数据上运行你的逻辑并且更新/插入很好。检查此代码。我怀疑在 TABLEB 中你已经有一些具有相同“rvnum”值的“AlterID”在“TableA”中不存在

看到下面的结果,而不是(3,3)我也看到(4,3)

    SET NOCOUNT ON
    DECLARE @t1 TABLE
    (
        id      INT
        ,VALUE  INT
    )
    INSERT INTO @t1 ( id, VALUE )
    SELECT 1,1 UNION ALL SELECT 2,2 UNION ALL SELECT 3,3

    DECLARE @t2 TABLE
    (
        id      INT
        ,VALUE  INT
    )
    INSERT INTO @t2 ( id, VALUE )
    SELECT 1,1 UNION ALL SELECT 2,2 UNION ALL SELECT 4,3

    DECLARE @Value1 INT,@Value2 INT,@ID INT ,@Prod_curs CURSOR
    SET @Prod_curs =CURSOR FOR 
    SELECT s.id, s.Value, r.value 
    FROM @t1 s LEFT OUTER JOIN
    @t2 r ON s.id=r.ID
    WHERE s.Value<>r.Value OR r.Value IS NULL
    OPEN @Prod_curs
    FETCH NEXT FROM @Prod_curs INTO @ID, @Value1, @Value2
    WHILE @@FETCH_STATUS=0
    BEGIN
        IF @Value2 IS NULL
        BEGIN                                           
            INSERT INTO @T2 (ID,Value) VALUES (@ID,ISNULL(@Value1,0))
        END
        IF @Value1<>@Value2
        BEGIN           
            UPDATE @T2 SET Value=@Value2 WHERE ID=@ID
        END
    FETCH NEXT FROM @Prod_curs INTO @ID, @Value1, @Value2
    END
    CLOSE @Prod_curs;
    DEALLOCATE @Prod_curs;

    SELECT  TOP 1 * FROM @t2 WHERE VALUE = 3

在此处输入图像描述

于 2013-10-10T15:50:25.953 回答