我有一个SQL查询,我正在测试,并运行如下,但我注意到它似乎每次返回不同的数据,然后我意识到当我检查它是否工作时,它甚至返回了不同数量的行!!我已经运行了多次,最后的select语句将返回25-32行之间的某处,但是这种情况如何改变呢?
我正在使用begin tran和rollback tran处理相同的数据,我不认为这是问题所在。有人能发现我做错了什么吗??
它在一个由Id对组成的表(#AddressToDeleteMasterOfLesserId)上工作,并在客户地址上设置一个标志(IsPrimaryAddress),如果客户地址存在于表中并且其对设置了标志。#AddressToDeleteMasterOfLesserId已经定义,并且不会更改。
begin tran t1
select CustomerAddress.IsPrimaryAddress, p1.[Id that is master],p1.[Id to delete], c2.IsPrimaryAddress
FROM CustomerAddress
join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master]
join CustomerAddress c2 on p1.[Id to delete]=c2.Id
order by [Id that is master]
--Update primary address
UPDATE CustomerAddress
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END
FROM CustomerAddress
join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master]
join CustomerAddress c2 on p1.[Id to delete]=c2.Id
select CustomerAddress.IsPrimaryAddress, p1.[Id that is master],p1.[Id to delete], c2.IsPrimaryAddress
FROM CustomerAddress
join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master]
join CustomerAddress c2 on p1.[Id to delete]=c2.Id
where CustomerAddress.IsPrimaryAddress=0
and c2.IsPrimaryAddress=1
order by [Id that is master]
rollback tran t1发布于 2012-03-21 18:10:25
您的#AddressToDeleteMasterOfLesserId表必须包含一些对,其中相同的Id that is master与多个Id to delete配对,并且这些Ids to delete在CustomerAddress表中具有不同的匹配值IsPrimaryAddress。
在更新阶段,这样的Id that is master行的IsPrimaryAddress被随机更新为1或0,这取决于选择哪个匹配的Id to delete行作为新值的源。
发布于 2012-03-21 11:53:53
这不会在每次运行中产生相同输出的唯一方法是,要么您正在执行此操作之外的其他操作,要么其他人正在执行此操作之外的其他操作,或者如果您有多个打开的事务,则可能会变得不可靠。如果是后者,并且/或者要测试它,只需运行ROLLBACK TRAN,直到您得到一个错误,指出没有打开的事务。如果你第一次得到这个错误,那么你没有任何打开。
发布于 2022-01-24 14:28:18
对我来说,这个问题是由于SQL查询中的临时表造成的。在插入之前,需要检查并删除临时表。
IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL
DROP TABLE #tempTableName;https://stackoverflow.com/questions/9798022
复制相似问题