无法解决等于操作中“SQL_Latin1_General_Pref_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突

Posted

技术标签:

【中文标题】无法解决等于操作中“SQL_Latin1_General_Pref_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突【英文标题】:Cannot resolve the collation conflict between "SQL_Latin1_General_Pref_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation 【发布时间】:2011-01-04 03:02:42 【问题描述】:

我有以下疑问:

SELECT 
DISTINCT(po.SONumber) AS [Sales Order No_],
 po.PONumber AS PoNo, ph.[Buy-from Vendor No_] AS VendorNo, 
 ph.[Pay-to Name], ph.[Document Date], 'Ship-to Name' = 
 CASE WHEN sh.[Ship-to Name] > '' THEN sh.[Ship-to Name] ELSE sih.[Ship-to Name] END, 
 'Ship-to Post Code' = CASE WHEN sh.[Ship-to Post Code] > '' THEN sh.[Ship-to Post Code] ELSE sih.[Ship-to Post Code] END, 
 sh.DeliveryPhoneNo AS [Delivery Phone No], 'CustomerPriceGroup' = CASE WHEN sh.[Customer Price Group] > '' THEN sh.[Customer Price Group] ELSE sih.[Customer Price Group] END, 
 'DeliveryComment' = CASE WHEN sh.[Delivery Comment] > '' THEN sh.[Delivery Comment] ELSE sih.[Delivery Comment] END, 
 'GiftMessage' = CASE WHEN sh.[GiftMessage] > '' THEN sh.[GiftMessage] ELSE sih.[GiftMessage] END, 
 si.Shipped, si.ShippedDate, si.CourierID 

 FROM 
 NavisionMeta.dbo.PoToSo po, 
 [Crocus Live$Purchase Header] ph, 
 [Crocus Live$Purchase Line] pl, 
 [Crocus Live$Sales Header] sh, 
 [Crocus Live$Sales Invoice Header] sih, 
 NavisionMeta.dbo.SupplierInput si 

 WHERE po.PONumber = ph.[No_] AND 
 ph.[No_] = pl.[Document No_] AND 
 po.SONumber *= sh.No_ AND 
 po.SONumber *= sih.[Order No_] AND 
 po.PONumber *= si.PONo AND 
 ph.[Document Date] BETWEEN '01-01-10' AND '31-01-10' 

 ORDER BY po.PONumber DESC

当它执行时,我得到以下错误:

无法解决排序规则冲突 之间 “SQL_Latin1_General_Pref_CP1_CI_AS” 和“Latin1_General_CI_AS” 等于运算。

NavisionMeta 数据库的排序规则是 SQL_Latin1_General_Pref_CP1_CI_AS

我能做些什么来解决这个问题??

【问题讨论】:

【参考方案1】:

如果 a 和 b 是您要比较的两列,并且 a 使用排序规则 SQL_Latin1_General_Pref_CP1_AS,b 使用另一个,您可以说

 ... 
 WHERE a = b COLLATE SQL_Latin1_General_Pref_CP1_AS

这会将 b 转换为指定的排序规则,然后将其与 a 进行比较。

【讨论】:

你应该更喜欢非 SQL 排序规则。【参考方案2】:

可以为每列指定排序规则,因此您的一个或多个 *char-type 列将与您要比较的列具有不同的排序规则。使用a = b COLLATE SQL_Latin1_General_Pref_CP1_ASa = b COLLATE Latin1_General_CI_AS 正如 treaschf 所建议的那样。 为了获得最大效率,请从您认为具有最多行数的表中选择列的排序规则。这意味着较少的值将在比较期间转换其排序规则。

【讨论】:

关于效率,首先要考虑索引的使用,然后再考虑转化次数。如果转换了错误的列,查询可能会停止使用某些索引。【参考方案3】:

在您将 Navision 数据中的 varchar 值与非 Navision 数据进行比较时,您必须使用 COLLATE 子句强制进行排序。

例如,在您的示例中:-

...
po.SONumber *= sih.[Order No_] COLLATE SQL_Latin1_General_Pref_CP1_CI_AS AND 
...

【讨论】:

【参考方案4】:

我认为您确实应该使所有列都具有相同的排序规则。如果我需要将所有 varchar 列设置为相同的排序规则,我将此工具用于 db。 http://www.codeproject.com/KB/database/ChangeCollation.aspx

【讨论】:

以上是关于无法解决等于操作中“SQL_Latin1_General_Pref_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突的主要内容,如果未能解决你的问题,请参考以下文章

无法解决等于操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突[重复]

无法解决等于操作中“SQL_Latin1_General_Pref_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突

Unity sdk 版本等于0,无法打包如何解决

Unity sdk 版本等于0,无法打包如何解决

iOS UIScrollView 无法滚动 没有弹簧效果解决方案

SQL Server:尽管进行了转换,但无法解决排序规则冲突