将uniqueidentifier值插入新表

时间:2013-10-10 14:48:16

标签: sql-server uniqueidentifier

SQL Server 2008

我有一张包含2个字段的表格 表A
alterid uniqueidentifier
revnum varchar(50)

另一个表具有与第一个确切的字段 表B
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发生了变化,我无法弄清楚原因。

有人可以提供帮助

1 个答案:

答案 0 :(得分:0)

似乎代码工作正常它只是在插入/更新后选择你正在做的。 我的帖子里也有一些不清楚的东西。

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

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

类似于“从TABLEB中选择顶部1 *,其中revnum = xyz”?

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

看到以下结果,而我(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

enter image description here