Existen ocasiones en las cuales el collation de la base de datos no coincide con el del servidor. Si bien existe la posibilidad de utilizar ALTER DATABASE para cambiar el collation esto no resuelve todos los problemas porque internamente las tablas pueden tener columnas con un collation diferente al del servidor, y cambiarlas impone más desafíos.
Una de las posibles consecuencias que se producen bajo estas circunstancias, es que al ser diferentes los collations, se debe utilizar la sintaxis COLLATE por ejemplo para hacer un join entre una tabla temporal con el collation de la instancia y una tabla dentro de la base de datos con diferente collation. Esto en ocasiones invalida la utilización de índices y produce menor rendimiento. Por este y otros motivos a veces nos vemos forzados a modificar todas las tablas que tienen columnas con un collation diferente al del servidor, y hacerlo homogeneo e idéntico al del servidor. Para realizar esta tarea tediosa en ocasiones se requiere eliminar las restricciones FK, VIEW, TIGGERS, y otros elementos relacionados con la tabla, antes de realizar las modificaciones al collation con ALTER TABLE y luego recrearlos.
El script de PowerShell que pueden encontrar en el siguiente enlace les permite resolver esta tarea mediante objetos SMO y PowerShell. Para ello deben tener instalado al menos la versión 2 de PowerShell y los componentes clientes del SQL server 2008 o SQL server 2008 R2.
Artículo en Ingles
http://sqlblogcasts.com/blogs/martinbell/archive/2011/03/07/Changing-Database-Collations-with-Powershell.aspx?CommentPosted=true#commentmessage
Fuente del Script que cambia el collation
http://sqlblogcasts.com/blogs/martinbell/Powershell/Change-Collation.ps1.txt
IMPORTANTE
Es un excelente script que he utilizado en dos ocasiones y ha funcionado a la perfección. Sin embargo al momento de escribir este post existe un pequeño error en el script que se repite dentro de todas las funciones que generan los scripts TSQL que reconstruyen al final (FK, VIEW, etc) y que solo se produce cuando se ejecuta el script para realizar el cambio mediante autenticación SQL Server utilizando un usuario y password de SQL Server.
Solución
Para resolver este prblema, en TODAS las líneas donde dice
$Scripter=New-Object ("Microsoft.SqlServer.Management.Smo.Scripter") ($srv.Name) ;
Debe decir
$Scripter=New-Object ("Microsoft.SqlServer.Management.Smo.Scripter") ($srv)
El constructor del objeto “Smo.Scripter” tiene como parámetro un objeto “Smo.Server” y si no es válido usa las credenciales de Windows para intentar conectarse.