2013-07-12 4 views
33

ho spostato una delle nostre banche dati (DB1) da SQL Server 2008 al 2012 e quando ho eseguito le procedure memorizzate ho il seguente errorenon può risolvere il conflitto di confronto tra

non può risolvere il conflitto di confronto tra " SQL_Latin1_General_CP1_CI_AS" e "Latin1_General_CI_AS" nel uguale al funzionamento

ho cambiato le regole di confronto sulla base di dati usando

ALTER DATABASE [optimiser] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
ALTER DATABASE [optimiser] COLLATE SQL_Latin1_General_CP1_CI_AS 
ALTER DATABASE [optimiser] SET MULTI_USER 

Ma continuo a ricevere l'errore ogni volta che vengono eseguite le stored procedure. Ritengo che l'SP stia utilizzando un join in un altro database (ihistorian di GE) e presenta una mancata corrispondenza delle regole di confronto. È lì comunque per risolvere questo.

Sul vecchio server DB1 è stato impostato come Latin1_General_CI_AS e ciò funziona correttamente. La nuova posizione per il DB ha un valore predefinito di SQL_Latin1_General_CP1_CI_AS. Vale la pena di cambiare la collation n DB1 sul nuovo server di nuovo a Latin1_General_CI_AS ??

risposta

70

Il problema delle regole di confronto è che sebbene il database abbia le proprie regole di confronto, ogni tabella e ogni colonna possono avere le proprie regole di confronto. Se non specificato, prende il valore predefinito dell'oggetto genitore, ma può essere diverso.

Quando si modificano le regole di confronto del database, questo sarà il nuovo valore predefinito per tutte le nuove tabelle e colonne, ma non modifica le regole di confronto degli oggetti esistenti nel database. Devi andare e modificare manualmente le regole di confronto di ogni tabella e colonna.

Per fortuna ci sono script disponibili su Internet che possono fare il lavoro. Non ho intenzione di raccomandare eventuali come io non li ho provati ma qui ci sono alcuni link:

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

Update Collation of all fields in database on the fly

http://www.sqlservercentral.com/Forums/Topic820675-146-1.aspx

Se avete bisogno di avere regole di confronto diverse su due oggetti o non è possibile modificare le regole di confronto: è ancora possibile utilizzare JOIN utilizzando il comando COLLATE e scegliere le regole di confronto desiderate per l'unione.

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE Latin1_General_CI_AS 

o utilizzando database predefinito di regole di confronto:

SELECT * FROM A JOIN B ON A.Text = B.Text COLLATE DATABASE_DEFAULT