我正在尝试将数据从一个数据库移动到另一个数据库。在旧数据库中,有一列数据类型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实例。
答案 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
);