Ne peut pas résoudre le conflit de collation entre "SQL Latin1 General Pref CP1 CI AS" et "Latin1 General CI AS" dans l'égalité d'exploitation

j'ai la requête suivante:

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

Quand il s'exécute, j'obtiens l'erreur suivante:

Ne peut pas résoudre le conflit de classement entre "SQL_Latin1_General_Pref_CP1_CI_As" et "Latin1_General_CI_AS" dans le l'égalité à l'opération.

la compilation de la base de données NavisionMeta est SQL_Latin1_General_Pref_CP1_CI_As

Que puis-je faire pour arranger ça??

15
demandé sur pavium 2010-01-12 13:28:00

4 réponses

je pense que vous devriez vraiment faire tout ce que vous êtes colonnes ont le même classement. J'ai utilisé cet outil pour un db où j'ai eu besoin de mettre toutes les colonnes de varchar à la même collation. http://www.codeproject.com/KB/database/ChangeCollation.aspx

3
répondu Tom 2010-01-12 17:18:37

Si a et b sont deux colonnes que vous comparez, et a est avec collation SQL_Latin1_General_Pref_CP1_AS, et b est avec un autre, vous pouvez dire

 ... 
 WHERE a = b COLLATE SQL_Latin1_General_Pref_CP1_AS

cela transforme b en collation spécifiée, puis le compare avec A.

25
répondu treaschf 2010-01-12 10:38:00

la Collation peut être spécifiée par colonne, ainsi une ou plusieurs de vos colonnes de type *char auront une collation différente de la colonne à laquelle vous comparez. Utilisez

a = b COLLATE SQL_Latin1_General_Pref_CP1_AS

ou

a = b COLLATE Latin1_General_CI_AS

comme le suggère treaschf.

Pour une efficacité maximale choisissez la collation de la colonne du tableau que vous pensez aura le plus de lignes. Cela signifie que moins de valeurs seront converties au cours de la comparaison.

7
répondu AUSteve 2010-01-12 10:49:37

dans tous les cas où vous comparez une valeur varchar à partir de vos données Navision avec vos données non-Navision, vous devez forcer la collation en utilisant le COLLATE l'article.

par exemple, dans votre exemple:-

...
po.SONumber *= sih.[Order No_] COLLATE SQL_Latin1_General_Pref_CP1_CI_AS AND 
...
4
répondu Doogie 2010-01-12 10:50:11