select tb.schema_id, tb.name,c.name, c.collation_name, t.name, c.max_length, c.is_nullable,c.column_id
from sys.columns c
inner join sys.types t on t.user_type_id= c.user_type_id
inner join sys.tables tb on c.object_id=tb.object_id
where c.collation_name is not null
and t.is_user_defined=0 and tb.is_ms_shipped=0 and tb.name<>'sysdiagrams'
and c.collation_name<>'SQL_Latin1_General_CP1_CI_AS'
order by tb.name, c.column_id
By executing it you will list every column that has a different collation you would like to change. Now I am going to show you the code that generates the code to change the collation of columns. After executing this code you must take the output and execute it to have your columns collation changed for a different one. In this example I am using SQL_Latin1_General_CP1_CI_AS collation as my wanted collation, I mean I want to have SQL_Latin1_General_CP1_CI_AS as my new collation. You have to replace it according to your requirement.
Mind your head because the execution of output code may fail as some columns could have some constraints (for instance some Foreign keys, Primary Keys, Uniques, etc.) or indexes that you may need to drop them first and then recreate them after you change the collation of the column.
Just to finish, I highly recommend testing this code on a copy of your database to check whether any error appears because of reasons explained above, then doing what is necessary. Finally, being totally sure that there is no error, you can proceed with the execution on your database in production environment. Please let me know any remark or question you may have. Thanks for reading!
select 'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(tb.schema_id)) + '.' + QUOTENAME(tb.name) +
' ALTER COLUMN ' + QUOTENAME(c.name) + ' ' + QUOTENAME(t.name) + '(' + CAST( case when T.NAME='NVARCHAR' THEN c.max_length/2
WHEN T.NAME='NCHAR' THEN c.max_length/2 ELSE c.max_length END AS VARCHAR(10)) +')'
+' COLLATE SQL_Latin1_General_CP1_CI_AS' + CASE WHEN c.is_nullable =1 THEN ' NULL ' else ' NOT NULL ;' END--, c.collation_name,c.is_nullable
from sys.columns c
inner join sys.types t on t.user_type_id= c.user_type_id
inner join sys.tables tb on c.object_id=tb.object_id
where c.collation_name is not null
and t.is_user_defined=0 and tb.is_ms_shipped=0 and tb.name<>'sysdiagrams'
and c.collation_name<>'SQL_Latin1_General_CP1_CI_AS'
order by tb.name, c.column_id
Mind your head because the execution of output code may fail as some columns could have some constraints (for instance some Foreign keys, Primary Keys, Uniques, etc.) or indexes that you may need to drop them first and then recreate them after you change the collation of the column.
Just to finish, I highly recommend testing this code on a copy of your database to check whether any error appears because of reasons explained above, then doing what is necessary. Finally, being totally sure that there is no error, you can proceed with the execution on your database in production environment. Please let me know any remark or question you may have. Thanks for reading!