2010-01-12 7 views
15

Ho la seguente query:non può risolvere il conflitto di confronto tra "SQL_Latin1_General_Pref_CP1_CI_AS" e "Latin1_General_CI_AS" in uguale al funzionamento

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 

Quando si esegue, ottengo il seguente errore:

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

Le regole di confronto del database NavisionMeta sono SQL_Latin1_General_Pref_CP1_CI_AS

Cosa posso fare per risolvere questo problema ??

risposta

25

Se a e b sono due colonne si confrontano, e una è con SQL_Latin1_General_Pref_CP1_AS regole di confronto, e b è un altro, si può dire

... 
WHERE a = b COLLATE SQL_Latin1_General_Pref_CP1_AS 

Questo trasforma b per le regole di confronto specificato, e quindi confronta con a.

+0

si dovrebbe preferire un confronto non SQL. – devio

7

Le regole di confronto possono essere specificate per colonna, quindi una o più delle colonne * di tipo char avranno un confronto diverso rispetto alla colonna a cui si sta eseguendo il confronto. Utilizzare
a = b COLLATE SQL_Latin1_General_Pref_CP1_AS
o
a = b COLLATE Latin1_General_CI_AS
come suggerito da treaschf.
Per la massima efficienza, scegliere le regole di confronto della colonna dalla tabella che si ritiene avrà il maggior numero di righe. Ciò significa che meno valori avranno il loro confronto modificato durante il confronto.

+2

Per quanto riguarda l'efficienza, l'utilizzo dell'indice deve essere considerato prima, prima del numero di conversioni. La query potrebbe smettere di utilizzare determinati indici, se la colonna sbagliata viene convertita. – treaschf

+0

Ah sì, buona chiamata – AUSteve

4

In tutti i casi in cui si sta confrontando un valore varchar dai dati di Navision con i dati non Navision, è necessario forzare le regole di confronto utilizzando la clausola COLLATE.

ad esempio, nel tuo esempio: -

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