No se puede resolver el conflicto de intercalación entre "SQL_Latin1_General_CP1_CI_AS" y "Latin1_General_CI_AS" en la operación igual a

Resuelto jhowe asked hace 15 años • 25 respuestas

Tengo el siguiente código

SELECT tA.FieldName As [Field Name],
       COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
       COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
       U.UserName AS [User Name],
       CONVERT(varchar, tA.ChangeDate) AS [Change Date] 
  FROM D tA
       JOIN 
       [DRTS].[dbo].[User] U 
         ON tA.UserID = U.UserID
       LEFT JOIN 
       A tO_A 
         on tA.FieldName = 'AID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
       LEFT JOIN 
       A tN_A 
         on tA.FieldName = 'AID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
       LEFT JOIN 
       B tO_B 
         on tA.FieldName = 'BID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
       LEFT JOIN 
       B tN_B 
         on tA.FieldName = 'BID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
       LEFT JOIN 
       C tO_C 
         on tA.FieldName = 'CID' 
        AND tA.oldValue = tO_C.Name
       LEFT JOIN 
       C tN_C 
         on tA.FieldName = 'CID' 
        AND tA.newValue = tN_C.Name
 WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate

Al ejecutar el código, aparece el error pegado en el título después de agregar las dos combinaciones para la tabla C. Creo que esto puede tener algo que ver con el hecho de que estoy usando SQL Server 2008 y he restaurado una copia de esta base de datos en mi maquina que es del 2005.

jhowe avatar Oct 22 '09 21:10 jhowe
Aceptado

Hago lo siguiente:

...WHERE 
    fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT

Funciona todo el tiempo. :)

Valkyrie avatar Oct 22 '2009 14:10 Valkyrie

Tiene una discrepancia entre dos clasificaciones diferentes en su tabla. Puede comprobar qué intercalaciones tiene cada columna de su(s) tabla(s) utilizando esta consulta:

SELECT
    col.name, col.collation_name
FROM 
    sys.columns col
WHERE
    object_id = OBJECT_ID('YourTableName')

Las intercalaciones son necesarias y utilizadas al ordenar y comparar cadenas. En general, es una buena idea utilizar una única y exclusiva clasificación en toda la base de datos; no utilice diferentes clasificaciones dentro de una sola tabla o base de datos; solo está buscando problemas...

Una vez que se haya conformado con una sola clasificación, puede cambiar aquellas tablas/columnas que aún no coinciden usando este comando:

ALTER TABLE YourTableName
  ALTER COLUMN OffendingColumn
    VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL

Para encontrar los índices de texto completo en su base de datos, utilice esta consulta aquí:

SELECT
    fti.object_Id,
    OBJECT_NAME(fti.object_id) 'Fulltext index',
    fti.is_enabled,
    i.name 'Index name',
    OBJECT_NAME(i.object_id) 'Table name'
FROM 
    sys.fulltext_indexes fti
INNER JOIN 
    sys.indexes i ON fti.unique_index_id = i.index_id

Luego puede eliminar el índice de texto completo usando:

DROP FULLTEXT INDEX ON (tablename)
marc_s avatar Oct 22 '2009 14:10 marc_s

Utilice la collatecláusula en su consulta:

LEFT JOIN C tO_C on tA.FieldName = 'CID' AND tA.oldValue COLLATE Latin1_General_CI_AS = tO_C.Name  

Puede que no tenga la sintaxis exactamente correcta (marque BOL), pero puede hacer esto para cambiar la intercalación sobre la marcha para la consulta; es posible que deba agregar la cláusula para cada combinación.

editar: Me di cuenta de que esto no estaba del todo bien: la cláusula de clasificación va después del campo que necesita cambiar; en este ejemplo cambié la clasificación en el tA.oldValuecampo.

Ray avatar Oct 22 '2009 14:10 Ray