Не удается разрешить конфликт сортировки между "SQL_Latin1_General_Pref_CP1_CI_AS" и "Latin1_General_CI_AS" в равном действию

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

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

Что я могу сделать, чтобы исправить это?

Ответы

Ответ 1

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

Ответ 2

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

 ... 
 WHERE a = b COLLATE SQL_Latin1_General_Pref_CP1_AS

Это преобразовывает b в заданную сортировку, а затем сравнивает ее с.

Ответ 3

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

Ответ 4

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

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

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