I am working on a view, wherein I am using an inner join on two tables which are from two different servers. We are using linked server. When running the query I am getting this message:
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Arabic_CI_AS" in the equal to operation.
I don't know much about collation. Searching through internet I find solutions to use COLLATE
, but the concept of COLLATE
is not clear to me. Will it change anything for any of the databases? I am looking for a solution without changing anything for the databases.
Any good learning material for these concepts is welcome.
This question is related to
sql-server
database
collation
if the database is maintained by you then simply create a new database and import the data from the old one. the collation problem is solved!!!!!
I had problems with collations as I had most of the tables with Modern_Spanish_CI_AS
, but a few, which I had inherited or copied from another Database, had SQL_Latin1_General_CP1_CI_AS
collation.
In my case, the easiest way to solve the problem has been as follows:
I hope this helps other users.
I resolved a similar issue by wrapping the query in another query...
Initial query was working find giving individual columns of output, with some of the columns coming from sub queries with Max or Sum function, and other with "distinct" or case substitutions and such.
I encountered the collation error after attempting to create a single field of output with...
select
rtrim(field1)+','+rtrim(field2)+','+...
The query would execute as I wrote it, but the error would occur after saving the sql and reloading it.
Wound up fixing it with something like...
select z.field1+','+z.field2+','+... as OUTPUT_REC
from (select rtrim(field1), rtrim(field2), ... ) z
Some fields are "max" of a subquery, with a case substitution if null and others are date fields, and some are left joins (might be NULL)...in other words, mixed field types. I believe this is the cause of the issue being caused by OS collation and Database collation being slightly different, but by converting all to trimmed strings before the final select, it sorts it out, all in the SQL.
Adding to the accepted answer, you can used DATABASE_DEFAULT
as encoding.
This allows database to make choice for you and your code becomes more portable.
SELECT MyColumn
FROM
FirstTable a
INNER JOIN SecondTable b
ON a.MyID COLLATE DATABASE_DEFAULT = b.YourID COLLATE DATABASE_DEFAULT
Source: Stackoverflow.com