如何解决排序规则冲突

时间:2015-06-06 18:29:42

标签: sql sql-server-2012

我正在尝试将数据从一个数据库移动到另一个数据库。在旧数据库中,有一列数据类型DateTime,需要将其映射到新数据库中的新列,该数据库的类型为Date。

为了尝试完成此操作,我编写了以下sql查询

    UPDATE NewFishTrackerProfessional.dbo.LandingHeaders
  SET NewFishTrackerProfessional.dbo.LandingHeaders.LandingDate1 = (SELECT CONVERT(DATE,FishTracker.dbo.Landings.LandingDate) FROM FishTracker.dbo.Landings WHERE LandingHeaders.TicketNumber = FishTracker.dbo.Landings.TicketNo)

执行时会产生以下错误。

1无法解决" SQL_Latin1_General_CP1_CI_AS"之间的整理冲突和" Latin1_General_CI_AS"在等于操作。 SQL1.sql 2 1

有人可以提出一种可以解决这个问题的方法吗?

由于

原始数据库是在sqlserver 2005中写回来的,新数据库是在sqlserver 2012中创建的。我不再能够轻松访问sqlserver的2005实例。

1 个答案:

答案 0 :(得分:1)

问题可能不在date上(如果我们假设您确实使用的是原生类型)。这留下了where子句。因此,请使用COLLATE运算符:

UPDATE NewFishTrackerProfessional.dbo.LandingHeaders lh
    SET lh.LandingDate1 = (SELECT CONVERT(DATE, l.LandingDate)
                           FROM FishTracker.dbo.Landings l
                           WHERE lh.TicketNumber COLLATE Latin1_General_CI_AS  = ls.TicketNo COLLATE Latin1_General_CI_AS
                          );

我不知道哪个值在哪个校对中,所以我只是将操作员放在两边。您可能应该只将操作符放在lh的旁边,查询可以使用Landings.TicketNo上的索引。

编辑:

这表明您有多个与WHERE匹配的值。最简单的方法是使用TOP或聚合函数选择一个:

UPDATE NewFishTrackerProfessional.dbo.LandingHeaders lh
    SET lh.LandingDate1 = (SELECT TOP 1 CONVERT(DATE, l.LandingDate)
                           FROM FishTracker.dbo.Landings l
                           WHERE lh.TicketNumber COLLATE Latin1_General_CI_AS  = ls.TicketNo COLLATE Latin1_General_CI_AS
                          );

UPDATE NewFishTrackerProfessional.dbo.LandingHeaders lh
    SET lh.LandingDate1 = (SELECT MAX(CONVERT(DATE, l.LandingDate))
                           FROM FishTracker.dbo.Landings l
                           WHERE lh.TicketNumber COLLATE Latin1_General_CI_AS  = ls.TicketNo COLLATE Latin1_General_CI_AS
                          );