Ultimamente mi è capitato di dover migrare dei database SQL Server 2000/2005 da un server ad un altro. Solitamente non ci sono problemi, in quanto nel 90% dei casi la COLLATION del server e del database sono le stesse sia nel server di "partenza" che in quello di "destinazione". Il problema nasce quando le collation sono diverse. Provate infatti ad installare un Server DB con collation Latin1_General_CS_AS e creare un DB... Se non specificate che collation volete per il DB, esso prenderà quella del server. permettendovi però di cambiarla a posteriori. Qual'è l'inghippo? Che tutte le colonne varchar, nvarchar, ntext o text create con la collation Latin1_General_CS_AS avranno la stessa collation anche se si cambia la collation al DB, ovvero solo le nuove colonne prenderanno la nuova collation. Il dramma poi arriva quando, preso il DB e portato su di un server con collation Latin1_General_CI_AS (badate Case Insensitive!!... ma è solo un esempio, basta che le collation siano differenti), cominciano ad emergere errori dovuti all'utilizzo, magari in stored procedures, di tabelle temporanee o variabili di tipo TABLE: eh sì, perchè il TEMPDB utilizza la collation di default del server (in questo caso Latin1_General_CI_AS) mentre le nostre colonne che utilizziamo, magari per delle banali clausole WHERE hanno ancora COLLATION Latin1_General_CS_AS ...
Soluzione? Utilizzare la clausola COLLATE database_default nella creazione di colonne di tipo "testo".
Infatti (fonte MSDN):
You can also use the database_default option in the COLLATE clause to specify that a column in a temporary table use the collation default of the current user database for the connection instead of tempdb.
Quindi teniamo sempre d'occhio la collation di un DB... potremmo perdere ore in cerca di un errore molto difficile da scovare!!!