작동

2010-01-12 3 views
15

에 동일한에서 "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 

이 실행되면, 나는 다음과 같은 오류 얻을 :

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

NavisionMeta 데이터베이스의 데이터 정렬은 SQL_Latin1_General_Pref_CP1_CI_AS입니다.

이 문제를 해결하려면 어떻게해야합니까 ??

답변

25

a와 b는 비교하는 두 개의 열이, 그리고이 데이터 정렬 SQL_Latin1_General_Pref_CP1_AS 함께,와 b는 서로의 경우, 당신은이 지정된 데이터 정렬에 b를 변환 한 다음 비교

... 
WHERE a = b COLLATE SQL_Latin1_General_Pref_CP1_AS 

을 말할 수있다 그것을 가진.

+0

SQL 이외의 데이터 정렬을 선호합니다. – devio

7

열마다 데이터 정렬을 지정할 수 있으므로 * char 유형 열 중 하나 이상이 비교중인 열과 다른 데이터 정렬을 갖습니다. 사용 treaschf에 의해
a = b COLLATE SQL_Latin1_General_Pref_CP1_AS
또는
a = b COLLATE Latin1_General_CI_AS
을 제안한다.
효율성을 극대화하려면 가장 많은 행을 가질 것으로 생각되는 테이블에서 열의 데이터 정렬을 선택하십시오. 즉, 비교할 때 더 적은 값의 데이터 정렬이 변환됩니다.

+2

효율성과 관련하여 인덱스 사용은 먼저 변환 횟수보다 먼저 고려해야합니다. 잘못된 열이 변환되면 쿼리에서 특정 인덱스 사용이 중지 될 수 있습니다. – treaschf

+0

아, 그래, 좋은 전화 – AUSteve

4

Navision 데이터의 varchar 값과 Navision 이외의 데이터를 비교할 때마다 COLLATE 절을 사용하여 데이터 정렬을 강제해야합니다. 귀하의 예제에서

: -

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