2010-01-12 68 views
15

Tengo la siguiente consulta:no puede resolver el conflicto de intercalación entre "SQL_Latin1_General_Pref_CP1_CI_AS" y "Latin1_General_CI_AS" en el equivalente a la operación

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 

Cuando se ejecuta, me sale el siguiente error:

Cannot resolve the collation conflict between "SQL_Latin1_General_Pref_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

La intercalación de la base de datos NavisionMeta es SQL_Latin1_General_Pref_CP1_CI_AS

¿Qué puedo hacer para solucionar esto?

Respuesta

25

Si a y b son dos columnas que se comparan, y una es con SQL_Latin1_General_Pref_CP1_AS intercalación, y b es con otro, se puede decir

... 
WHERE a = b COLLATE SQL_Latin1_General_Pref_CP1_AS 

Esto transforma b para la intercalación especificada, y luego compara con a.

+0

Sin embargo, usted debería preferir una intercalación no SQL. – devio

7

La intercalación puede especificarse por columna, por lo que una o más de sus * columnas de tipo char tendrán una clasificación diferente a la columna que está comparando. Utilice
a = b COLLATE SQL_Latin1_General_Pref_CP1_AS
o
a = b COLLATE Latin1_General_CI_AS
según lo sugerido por treaschf.
Para obtener la máxima eficacia, elija la intercalación de la columna de la tabla que crea que tendrá la mayor cantidad de filas. Esto significa que menos valores tendrán su colación convertida durante la comparación.

+2

En cuanto a la eficiencia, el uso del índice se debe considerar primero, antes de la cantidad de conversiones. La consulta puede dejar de usar ciertos índices, si la columna incorrecta se está convirtiendo. – treaschf

+0

Ah sí, buena llamada – AUSteve

4

En todos los casos en que esté comparando un valor varchar de sus datos de Navision con los datos que no son de Navision, debe forzar la intercalación utilizando la cláusula COLLATE.

por ejemplo, en su ejemplo: -

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