更新集从不影响任何行

时间:2013-05-22 17:12:18

标签: sql tsql sql-update

更新查询如下:

UPDATE  Cust_Site
  SET   Cust_Site.Name= H.Name
FROM    Header H 
INNER JOIN Cust_Site S 
    ON   H.Name <> S.Name
    AND H.ID = S.ID
    AND H.Country = S.Country;

每当我运行它时,我会影响150行。但即使我使用COMMIT,Cust_Site中的行也不会发生任何变化。

可能是什么问题?

3 个答案:

答案 0 :(得分:3)

尝试输出update语句的inserted和deleted行,以查看更改内容:

UPDATE  Cust_Site
  SET   Cust_Site.Name= H.Name
OUTPUT deleted.Name, inserted.Name, inserted.*
FROM    Header H 
INNER JOIN Cust_Site S 
    ON H.ID = S.ID
    AND H.Country = S.Country
    AND H.Name <> S.Name

通过这种方式,您可以排除查询实际更新具有相同值的内容的可能性。

在运行查询之前,请执行@@Trancount以防万一您有任何未结交易。 确保您在同一个数据库中运行验证select

<强>更新

刚才有一件事发生在我身上:

  • 两个表中的列是否都声明了相同的类型? (即VARCHAR而非固定长度)

  • 您确定其中任何一个中的数据都不包含会导致UPDAte stmt名称不同的前导/尾随空格吗?比较时可以修剪它们吗?

答案 1 :(得分:0)

我会将此查询编写为相关子查询,如下所示,但如果子查询为每个cust_site行返回多行,则可能会失败并显示错误。如果确实失败了,那么这可能就是为什么你没有得到你期望的结果的线索。

UPDATE  Cust_Site
   SET  Name = (SELECT H.Name FROM Header H WHERE Name <> S.Name AND ID = S.ID AND Country = S.Country)
  FROM  Cust_Site S;

答案 2 :(得分:0)

尝试删除

ON   H.Name <> S.Name

并将条件移动到查询的末尾,因此:

WHERE   H.Name <> S.Name

看看你是否得到了相同的结果。

相关问题