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
Cuando ejecuto el código, obtengo 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 máquina que es 2005
fuente
Hago lo siguiente:
Funciona todo el tiempo. :)
fuente
Use la
collate
cláusula en su consulta:Es posible que no tenga la sintaxis correcta (marque BOL), pero puede hacer esto para cambiar la intercalación sobre la marcha de la consulta; es posible que deba agregar la cláusula para cada combinación.
editar: me di cuenta de que esto no era del todo correcto: la cláusula de clasificación va después del campo que debe cambiar; en este ejemplo, cambié la clasificación en el
tA.oldValue
campo.fuente
Identifique los campos para los que arroja este error y agregue lo siguiente: COLLATE DATABASE_DEFAULT
Hay dos tablas unidas en el campo Código:
Actualice su consulta a:
fuente
Esto puede suceder fácilmente cuando tiene 2 bases de datos diferentes y especialmente 2 bases de datos diferentes de 2 servidores diferentes. La mejor opción es cambiarlo a una colección común y hacer la unión o la comparación.
fuente
@Valkyrie impresionante respuesta. Pensé que ponía aquí un caso cuando realizaba lo mismo con una subconsulta dentro de un procedimiento almacenado, ya que me preguntaba si su respuesta funciona en este caso, y fue genial.
fuente
En donde los criterios agregan
collate SQL_Latin1_General_CP1_CI_AS
Esto funciona para mi.
fuente
La causa raíz es que la base de datos del servidor sql de la que tomó el esquema tiene una intercalación que difiere de su instalación local. Si no desea preocuparse por la clasificación, vuelva a instalar SQL Server localmente utilizando la misma clasificación que la base de datos SQL Server 2008.
fuente
error (No se puede resolver el conflicto de intercalación entre ...) generalmente ocurre al comparar datos de múltiples bases de datos.
como no puede cambiar la clasificación de las bases de datos ahora, use COLLATE DATABASE_DEFAULT.
fuente
He tenido algo como esto antes, y lo que encontramos fue que la clasificación entre 2 tablas era diferente.
Comprueba que son iguales.
fuente
Gracias a la respuesta de marc_s resolví mi problema original, inspirado para ir un paso más allá y publicar un enfoque para transformar una tabla completa a la vez: script tsql para generar las declaraciones de la columna alternativa:
gets: ALTER TABLE Affiliate ALTER COLUMN myTable NVARCHAR (4000) COLLATE Latin1_General_CI_AS NOT NULL
Admitiré estar desconcertado por la necesidad de col.max_length / 2 -
fuente
Para aquellos que tienen un script CREATE DATABASE (como fue mi caso) para la base de datos que está causando este problema, pueden usar el siguiente script CREATE para que coincida con la clasificación:
o
Esto aplica la clasificación deseada a todas las tablas, que era justo lo que necesitaba. Es ideal tratar de mantener la clasificación igual para todas las bases de datos en un servidor. Espero que esto ayude.
Más información en el siguiente enlace: SERVIDOR SQL: creación de una base de datos con una clasificación diferente en el servidor
fuente
He usado el contenido de este sitio para crear el siguiente script que cambia la recopilación de todas las columnas en todas las tablas:
fuente
Verifique el nivel de intercalación que no coincide (servidor, base de datos, tabla, columna, carácter).
Si es el servidor, estos pasos me ayudaron una vez:
Ejecute este comando:
sqlservr -m -T4022 -T3659 -s"name_of_insance" -q "name_of_collation"
Inicie su servidor sql:
net start name_of_instance
Verifique nuevamente la clasificación de su servidor.
Aquí hay más información:
https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/
fuente
Si esto ocurre en toda su base de datos, entonces es mejor cambiar la clasificación de la base de datos de la siguiente manera:
Referencia aquí
fuente
Se agregó código a la respuesta de @ JustSteve para tratar con las columnas varchar y varchar (MAX):
fuente
Para resolver este problema en la consulta sin cambiar ninguna de las bases de datos, puede convertir las expresiones en el otro lado del signo "=" con
como se sugiere aquí .
fuente
Tuve un error similar (No se puede resolver el conflicto de intercalación entre "SQL_Latin1_General_CP1_CI_AS" y "SQL_Latin1_General_CP1250_CI_AS" en la operación INTERSECT), cuando utilicé el controlador jdbc antiguo.
Resolví esto descargando un nuevo controlador de Microsoft o el proyecto de código abierto jTDS .
fuente
Esto es lo que hicimos, en nuestra situación necesitamos una consulta ad hoc que se ejecute utilizando una restricción de fecha bajo demanda, y la consulta se define en una tabla.
Nuestra nueva consulta debe hacer coincidir los datos entre diferentes bases de datos e incluir datos de ambos.
Parece que COLLATION es diferente entre la base de datos que importa datos del sistema iSeries / AS400 y nuestra base de datos de informes; esto podría deberse a los tipos de datos específicos (como los acentos griegos en los nombres, etc.).
Entonces usamos la siguiente cláusula de unión:
fuente
Puede hacer esto fácilmente mediante 4 sencillos pasos
fuente
fuente
Es posible que no tenga ningún problema de intercalación en su base de datos, pero si restaura una copia de su base de datos desde una copia de seguridad en un servidor con una intercalación diferente al origen, y su código está creando tablas temporales, esas tablas temporales heredarán la intercalación de el servidor y habría conflictos con su base de datos.
fuente
fuente
Tenía un requerimiento similar; documentando mi enfoque aquí para cualquier persona con un escenario similar ...
Guión
Solución
Use la comparación de esquemas de SQL Server (de SQL Server Data Tools / Visual Studio) para comparar el origen (instalación limpia) con el destino (el db con intercalación no válida).
En mi caso, comparé los dos DB directamente; aunque podría trabajar a través de un proyecto para permitirle ajustar manualmente las piezas entre ...
Object Types
seleccione solo los tipos que le interesan (para mí solo eranViews
yTables
)General
seleccionar:DELETE
carpeta y seleccionandoEXCLUDE
.CREATE
objeto (aquí, dado que no existen en el objetivo, no pueden tener una clasificación incorrecta allí; si deberían existir es una pregunta para otro tema).Update
para empujar cambiosEsto todavía implica un esfuerzo manual (por ejemplo, comprobar que solo está afectando la clasificación), pero maneja las dependencias por usted.
También puede mantener un proyecto de base de datos del esquema válido para que pueda usar una plantilla universal para sus bases de datos en caso de que tenga más de 1 para actualizar, suponiendo que todas las bases de datos de destino terminen con el mismo esquema.
También puede usar buscar / reemplazar en los archivos en un proyecto de base de datos si desea modificar en masa la configuración allí (por ejemplo, para crear el proyecto a partir de la base de datos inválida usando la comparación de esquemas, enmendar los archivos del proyecto, luego alternar el origen / destino en el esquema se compara para enviar los cambios nuevamente a la base de datos
fuente