Не удается разрешить конфликт сопоставления между «SQL_Latin1_General_Pref_CP1_CI_AS» и «Latin1_General_CI_AS» в операции равно - PullRequest
15 голосов
/ 12 января 2010

У меня следующий запрос:

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 ]

25 голосов
/ 12 января 2010

Если a и b - это два столбца, которые вы сравниваете, а a с сопоставлением SQL_Latin1_General_Pref_CP1_AS, а b с другим, можно сказать

 ... 
 WHERE a = b COLLATE SQL_Latin1_General_Pref_CP1_AS

Преобразует b в указанное сопоставление, а затем сравнивает его с a.

7 голосов
/ 12 января 2010

Сортировка может быть указана для каждого столбца, поэтому один или несколько ваших столбцов типа * char будут иметь разную сортировку для столбца, с которым вы сравниваете. Используйте
a = b COLLATE SQL_Latin1_General_Pref_CP1_AS
или
a = b COLLATE Latin1_General_CI_AS
как предложено treaschf.
Для максимальной эффективности выберите параметры сортировки столбца из таблицы, которая, по вашему мнению, будет иметь наибольшее количество строк. Это означает, что при сравнении сравниваются меньшие значения.

4 голосов
/ 12 января 2010

В каждом случае, когда вы сравниваете значение varchar из ваших данных Navision с вашими данными, не относящимися к Navision, вы должны форсировать сравнение, используя предложение COLLATE.

Например, в вашем примере: -

...
po.SONumber *= sih.[Order No_] COLLATE SQL_Latin1_General_Pref_CP1_CI_AS AND 
...
3 голосов
/ 12 января 2010

Я думаю, вы действительно должны сделать так, чтобы все столбцы имели одинаковое сопоставление. Я использовал этот инструмент для БД, где мне нужно было установить для всех столбцов varchar одинаковое сопоставление. http://www.codeproject.com/KB/database/ChangeCollation.aspx

...