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
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.
Hago lo siguiente:
...WHERE
fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT
Funciona todo el tiempo. :)
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)
Utilice la collate
clá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.oldValue
campo.