none
SQL Server 2008 R2 error de Collation en la operacion UNION RRS feed

  • Pregunta

  • Estimados, favor su ayuda,

    tengo dos BDs en SQL Server 2008 R2 una tenia SQL_Latin1_General_CP1_CI_AS y la otra Modern_Spanish_CI_AI, dejé las dos BDs con el Collation Modern_Spanish_CI_AI, pero al ejecutar el StoredProcedure me da el error:

    Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Modern_Spanish_CI_AI"in the UNION operation

    El error se produce con estas líneas:

    UNION
    SELECT
     ID   AS [rbhCode] ,
     Codigo AS rbhExternalCode,
     NOMBRE AS rbhName,

    Revisé el collation de ambas BDs y Tablas y todas tienen el mismo Collation (Modern_Spanish_CI_AI) pero aun así me sigue dando el error de conflicto de collation.

    Si dejo la query de la siguiente forma no muestra error:

    UNION
    SELECT
     ID   AS [rbhCode] ,
     Codigo collate SQL_Latin1_General_CP1_CI_AS AS rbhExternalCode,
     NOMBRE collate SQL_Latin1_General_CP1_CI_AS AS rbhName,

    Me falta hacer algo adicional al cambio de collation para evitar escribir el collation en la query?

    Por su gran ayuda, muchas gracias.


    CRAS

    martes, 10 de enero de 2017 19:10

Respuestas

  • Si aunque si quieres reparar el cambio en las antiguas te tomara un rato, aqui hablan un poco de este problema, en general la modern ya quedo depreciada (corriganme porque no me acuerdo bien... en el 2005) y ahora solo se usa la latin pero tendrias que hacer un cambio que te tomara bastante tiempo en general, no es dificil pero si algo laborioso.

    http://www.olcot.co.uk/sql-blogs/revised-difference-between-collation-sql_latin1_general_cp1_ci_as-and-latin1_general_ci_as


    martes, 10 de enero de 2017 20:53
  • Que tenga o no un collation diferente no tiene porque ser ni bueno ni malo.

    yo de hecho no estoy seguro que interese tocar el collation de bases de datos ya existentes, de hecho SQL Server permite varios collations distintos en la misma tabla por una buena razón , básicamente porque puede ser que necesites esa intercalación por un orden específico o diferenciar mayúsculas o no.. etc.

    Adicionalmente si tu problema es puntual con ese unión all no tiene sentido dar una solución global ( y algo exagerada) a un problema local y puntual

    prueba a poner el collation en todas las partes del unión así funcionara seguroa

    SELECT
     ID   AS [rbhCode] ,
     Codigo collate SQL_Latin1_General_CP1_CI_AS AS rbhExternalCode,
     NOMBRE collate SQL_Latin1_General_CP1_CI_AS AS rbhName

    from tabla1

    UNION
    SELECT
     ID   AS [rbhCode] ,
     Codigo collate SQL_Latin1_General_CP1_CI_AS AS rbhExternalCode,
     NOMBRE collate SQL_Latin1_General_CP1_CI_AS AS rbhName

    from tabla2

    Además revisa si necesitas unión (que implícitamente ejecuta un distinct) o te vale con unión all que no hace el distinct y será más rápido


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 11 de enero de 2017 9:38
    Moderador

Todas las respuestas

  • Para evitarte esto deberias tener que "sincronizar" el collation de una de las BBDD, esto lo puedes hacer de esta forma:

    USE master;
    GO
    ALTER DATABASE YourDB
    COLLATE --Aqui escribes el collation deseado ;  
    GO

    En caso que no puedas hacerlo, tendrias la posibilidad de usar vistas que incorporen el collation y asi podrias ahorrarte el tener que hacer el hint en cada llamada y podrias llamar directamente a la vista.


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    martes, 10 de enero de 2017 19:56
  • Saludos Kromo21

    Lamentablemente lo que hiciste y lo que recomienda Gio no es una solucion ya que lo unico que haces es basicamente indicarle (de aqui para adelante usa este collation) debes de arreglar toda la data bajo el nuevo collation o como bien hiciste forzar el collation por el que haga la comparacion.

    martes, 10 de enero de 2017 20:34
  • Muchas gracias Gio

    otro dato, me di cuenta que la Instancia tiene un Collation distinto al de muchas BDs que contiene, esto pasa a ser una mala practica o no tiene mayor impacto?


    CRAS

    martes, 10 de enero de 2017 20:37
  • En este caso especifico, lo que vez es casi seguro por una migracion de SQL Server 2005 o anterior a SQL Server 2008 haciendo un inplace upgrade ya que cambio el collation default en 2008 y es bastante comun este error, el mayor problema es que las nuevas vendran con otro collation que la tempdb, el problema se presenta con comparaciones de cadenas de texto entre diferentes collation y la tempdb si es otro 

    O sea posiblemente arbol y arbol no sean la mismo porque el codigo de un caracter es dintinto.


    • Editado Enrique AA martes, 10 de enero de 2017 21:57
    martes, 10 de enero de 2017 20:39
  • Muchas gracias Enrique, entonces tendría que dejar el Collation que tiene La instancia? al revisar el motor y su instancia, me indica un collation, pero varias BDs tienen un collation distinto al de la instancia.

    CRAS

    martes, 10 de enero de 2017 20:44
  • Si aunque si quieres reparar el cambio en las antiguas te tomara un rato, aqui hablan un poco de este problema, en general la modern ya quedo depreciada (corriganme porque no me acuerdo bien... en el 2005) y ahora solo se usa la latin pero tendrias que hacer un cambio que te tomara bastante tiempo en general, no es dificil pero si algo laborioso.

    http://www.olcot.co.uk/sql-blogs/revised-difference-between-collation-sql_latin1_general_cp1_ci_as-and-latin1_general_ci_as


    martes, 10 de enero de 2017 20:53
  • OK, muchas gracias!

    CRAS

    martes, 10 de enero de 2017 21:02
  • Gracias por la correcion Enrique, efectivamente debes completar esta tarea con la refactorización de las tablas existentes con un collation diferente, aquí esta otro documento muy interesante al respecto.

    http://sqlmag.com/database-performance-tuning/seven-step-process-changing-database-collation


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    martes, 10 de enero de 2017 21:08
  • Que tenga o no un collation diferente no tiene porque ser ni bueno ni malo.

    yo de hecho no estoy seguro que interese tocar el collation de bases de datos ya existentes, de hecho SQL Server permite varios collations distintos en la misma tabla por una buena razón , básicamente porque puede ser que necesites esa intercalación por un orden específico o diferenciar mayúsculas o no.. etc.

    Adicionalmente si tu problema es puntual con ese unión all no tiene sentido dar una solución global ( y algo exagerada) a un problema local y puntual

    prueba a poner el collation en todas las partes del unión así funcionara seguroa

    SELECT
     ID   AS [rbhCode] ,
     Codigo collate SQL_Latin1_General_CP1_CI_AS AS rbhExternalCode,
     NOMBRE collate SQL_Latin1_General_CP1_CI_AS AS rbhName

    from tabla1

    UNION
    SELECT
     ID   AS [rbhCode] ,
     Codigo collate SQL_Latin1_General_CP1_CI_AS AS rbhExternalCode,
     NOMBRE collate SQL_Latin1_General_CP1_CI_AS AS rbhName

    from tabla2

    Además revisa si necesitas unión (que implícitamente ejecuta un distinct) o te vale con unión all que no hace el distinct y será más rápido


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 11 de enero de 2017 9:38
    Moderador
  • Muchas gracias.

    CRAS

    miércoles, 11 de enero de 2017 21:23