how change cambiar sql sql-server collation tempdb

change - Conflicto de intercalación de la tabla temporal-Error: no se puede resolver el conflicto de intercalación entre Latin1*y SQL_Latin1*



how to change collation of system database in sql server 2012 (4)

No puedo actualizar la tabla temporal. Esta es mi consulta

CREATE TABLE #temp_po(IndentID INT, OIndentDetailID INT, OD1 VARCHAR(50), OD2 VARCHAR(50), OD3 VARCHAR(50), ORD VARCHAR(50), NIndentDetailID INT, ND1 VARCHAR(50), ND2 VARCHAR(50), ND3 VARCHAR(50), NRD VARCHAR(50), Quantity DECIMAL(15,3)) INSERT INTO #temp_po(IndentID, OIndentDetailID, OD1, OD2, OD3, ORD) SELECT ID.IndentID, ID.IndentDetailID, ID.D1, ID.D2, ID.D3, ID.RandomDimension FROM STR_IndentDetail ID WHERE ID.IndentID = @IndentID UPDATE t SET t.ND1 = CASE WHEN D.D1 = '''' THEN NULL ELSE D.D1 END, t.ND2 = CASE WHEN D.D2 = '''' THEN NULL ELSE D.D2 END, t.ND3 = CASE WHEN D.D3 = '''' THEN NULL ELSE D.D3 END, t.NRD = CASE WHEN D.RandomDim = '''' THEN NULL ELSE D.RandomDim END, t.Quantity = D.PurchaseQty FROM #temp_po t INNER JOIN @detail D ON D.IndentDetailID = t.OIndentDetailID WHERE t.IndentID = @IndentID

Pero da el error.

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

¿Cómo resolver este problema?

Mi Latin1_General_CI_AI tempdb es Latin1_General_CI_AI y mi Latin1_General_CI_AI base de datos real es SQL_Latin1_General_CP1_CI_AS .


Cambiar la intercalación del servidor no es una decisión directa, puede haber otras bases de datos en el servidor que pueden verse afectadas. Incluso cambiar la intercalación de la base de datos no siempre es recomendable para una base de datos poblada existente. Creo que el uso de COLLATE DATABASE_DEFAULT cuando se crea una tabla temporal es la opción más segura y fácil, ya que no codifica ninguna intercalación en su sql. Por ejemplo:

CREATE TABLE #temp_table1 ( column_1 VARCHAR(2) COLLATE database_default )


Esto sucede porque las intercalaciones en #tempdb.temp_po.OD1 y STR_IndentDetail.D1 son diferentes.

Ya que tienes control sobre la creación de la tabla temporal, la forma más fácil de resolver esto parece ser crear * char columnas en la tabla temporal con la misma clasificación que tu tabla STR_IndentDetail :

CREATE TABLE #temp_po( IndentID INT, OIndentDetailID INT, OD1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS, .. Same for the other *char columns

En la situación en la que no tiene control sobre la creación de la tabla, cuando se une a las columnas, otra forma es agregar sentencias COLLATE explícitas en el DML donde ocurren los errores, ya sea a través de COLLATE SQL_Latin1_General_CP1_CI_AS o más fácil, utilizando COLLATE DATABASE_DEFAULT

SELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s ON t.OD1 = s.D1 COLLATE SQL_Latin1_General_CP1_CI_AS;

O mas facil

SELECT * FROM #temp_po t INNER JOIN STR_IndentDetail s ON t.OD1 = s.D1 COLLATE DATABASE_DEFAULT;

SqlFiddle aquí


Nos encontramos con el mismo problema en este momento. En lugar de agregar la intercalación a la creación de la tabla temporal (o a cada combinación de la tabla temporal), simplemente cambiamos la creación de la tabla temporal a una declaración de variable de tabla.


Por defecto, la tabla temporal toma la intercalación del servidor. Entonces, en lugar de actualizar todos los procedimientos almacenados con la tabla temporal, cambie solo la intercalación del servidor.

Compruebe este enlace para establecer o cambiar la intercalación del servidor

Esto funcionó para mí.