Thursday, October 04, 2012

خطای Collation هنگام مقایسه دو فیلد متفاوت در MSSQL

داشتم کوئری زیر را اجرا می کردم که نام پروژه های استفاده نشده را در جدول دوم بدست بیاورم:  
select ProjectCode from table1
where ProjectCode not  in (select  ProjectCode  from table2)

که با خطای زیر مواجه شدم : 
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

اشکال اینجاست که فیلد ProjectCode در جدول اول از Collate یا نوع انطباق SQL_Latin1_General_CP1_CI_AS  و در جدول دوم از Collate  یا نوع انطباق  Latin1_General_CI_AS  است.

Collate  یا Collation چبست ؟ 
در SQL برای ذخیره رشته ها از روشهای متفاوتی استفاده می شود تا برای ایندکس و جستجوی آنها به کارایی بهتری رسید. به این روشها Collate می گویند . شما حتی اگر یک فیلد را با نوع مثلا nvcarchar ذخیره کرده باشید ولی با Collate متفاوت ، نمی توانید آنها را بدون تبدیل کردن مقایسه کنید. 
برای مقایسه فیلدهای با Collate متفاوت از تبدیل زیر استفاده کنید: 

select  FILEDNAME collate COLLATENAME from TABEL

مثال گفته شده در اول این مقاله به صورت زیر قابل اجراست :
select ProjectCode from table1
where ProjectCode not  in
(select  ProjectCode collate SQL_Latin1_General_CP1_CI_AS from table2)

مقاله کاملی در این باره همراه با مثال در آدرس زیر می توانید بخوانید :