داشتم کوئری زیر را اجرا می کردم که نام پروژه های استفاده نشده را در جدول دوم بدست بیاورم:
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)
مقاله کاملی در این باره همراه با مثال در آدرس زیر می توانید بخوانید :