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发生了变化,我无法弄清楚原因。
有人可以提供帮助
答案 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