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

时间:2010-01-12 10:28:00

标签: sql-server tsql collation

我有以下查询:

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

我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:25)

如果a和b是你要比较的两列,而a是与排序规则SQL_Latin1_General_Pref_CP1_AS,而b是与另一列,你可以说

 ... 
 WHERE a = b COLLATE SQL_Latin1_General_Pref_CP1_AS

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

进行比较

答案 1 :(得分:7)

可以按列指定排序规则,因此一个或多个* char-type列将与要比较的列具有不同的排序规则。使用
a = b COLLATE SQL_Latin1_General_Pref_CP1_AS

a = b COLLATE Latin1_General_CI_AS
正如treaschf所建议的那样 为了获得最大效率,请从您认为具有最多行数的表中选择列的排序规则。这意味着较少的值将在比较期间转换其排序规则。

答案 2 :(得分:4)

在将Navision数据的varchar值与非Navision数据进行比较的每种情况下,都必须使用COLLATE子句强制进行整理。

例如,在您的示例中: -

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

答案 3 :(得分:3)

我认为你真的应该让所有你的列具有相同的排序规则。我使用此工具作为数据库我需要将所有varchar列设置为相同的排序规则。 http://www.codeproject.com/KB/database/ChangeCollation.aspx