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??
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
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.
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. Utiliseza = b COLLATE SQL_Latin1_General_Pref_CP1_AS
oua = 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.
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
...