خطای 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)

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




/ 0 نظر / 58 بازدید