【问题标题】:SQL Update, same query, different results each timeSQL 更新,同样的查询,每次结果都不一样
【发布时间】:2012-03-21 02:56:23
【问题描述】:

我有一个正在测试的 SQL 查询,运行如下,但我注意到它似乎每次都返回不同的数据,然后我意识到当我检查它是否有工作!我已经运行了多次,最终的 select 语句将返回 25-32 行之间的某个位置,但是如何改变呢?

我正在使用begin tranrollback tran 处理相同的数据,但不要相信这是问题所在。谁能发现我做错了什么?

它适用于一个表 (#AddressToDeleteMasterOfLesserId),它是一对 Id,并在客户地址上设置一个标志 (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

【问题讨论】:

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


    【解决方案1】:

    您的#AddressToDeleteMasterOfLesserId 表必须包含一些对,其中相同的Id that is master 与多个Id to delete 配对,并且这些Ids to deleteCustomerAddress 表中具有不同的IsPrimaryAddress 匹配值。

    在更新阶段,Id that is master 行的 IsPrimaryAddress 随机更新为 1 或 0,具体取决于选择匹配的 Id to delete 行作为新值的来源。

    【讨论】:

    • 当然!!!!现在我再看一遍,这完全有道理。我会问另一个问题我该如何解决这个问题,但你知道是否有办法让替代案例“什么都不做”,设置为自身不起作用,因为它会在第一次读取时给出错误的答案
    【解决方案2】:

    这不会在每次运行时产生相同输出的唯一方法是,要么您在此之外执行其他操作,或者其他人在此之外执行其他操作,或者这可能会变得不稳定如果您有多个未结交易。如果是后者,和/或测试它,只需运行ROLLBACK TRAN,直到您收到一条错误消息,指出没有打开的事务。如果您第一次收到错误,那么您没有任何打开。

    【讨论】:

    • 第一次出现错误,没有其他人接触数据,因为它已全部复制到单独的数据库中,因此我可以使用它。现在至少运行了 20-30 次,每次都不一样...放入 go 语句以确保它不是一些奇怪的时间问题,仍在发生...
    • 您的#AddressToDeleteMasterOfLesserId 表怎么样。在它们中添加一个 select * from #AddressToDeleteMasterOfLesserId ,看看是否有变化。
    • 感谢您的帮助,Andriy 达到了目标。数据中有重复,当它击中它们时,它正在将它们设置回去,现在看起来很明显,但昨天差点把我逼到窗台上!!
    【解决方案3】:

    对我来说,问题是由于 SQL 查询中的临时表而发生的。插入前需要检查并删除临时表。

    IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL
        DROP TABLE #tempTableName;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多