2010-04-20 25 views
10

Tengo dos preguntas:no se puede resolver el conflicto de intercalación en la Unión seleccionar

Primero no funciona:

select hotels.TargetCode as TargetCode from hotels 
union all 
select DuplicatedObjects.duplicatetargetCode as TargetCode 
from DuplicatedObjects where DuplicatedObjects.objectType=4 

porque me sale error:

Cannot resolve collation conflict for column 1 in SELECT statement. 

segunda obra:

select hotels.Code from hotels where hotels.targetcode is not null 
union all 
select DuplicatedObjects.duplicatetargetCode as Code 
from DuplicatedObjects where DuplicatedObjects.objectType=4 

Estructura:

Hotels.Code -PK nvarchar(40) 
Hotels.TargetCode - nvarchar(100) 

DuplicatedObjects.duplicatetargetCode PK nvarchar(100) 
+1

¿Cuál es la relevancia de C# aquí? –

+0

@John Skeet Lo he corregido – user278618

Respuesta

9

Utilice sp_help en ambas tablas. La recopilación en hotels.TargetCode es diferente de la intercalación en DuplicatedObjects.duplicateTargetCode, por lo que el DB no sabe qué hacer con el resultado UNION.

Puede forzar una nueva intercalación en una de ellas para que coincida con la otra, o poner los resultados en una tabla/tabla temporal predefinida que ya tendrá una intercalación definida.

EDIT: Puede anular la colación existente utilizando algo como ...

DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS 

... en la consulta. Esto utilizará duplicateTargetCode con la intercalación SQL_Latin1_General_CP1_CI_AS. Debe elegir una intercalación que coincida con la de hotels.TargetCode.

2

Intentar establecer la intercalación en una consulta cuando se une a un servidor vinculado aún puede fallar con Incorrect syntax near 'COLLATE' aunque su sintaxis sea correcta.

Solución: En Propiedades del servidor vinculado, configure Use Remote Collation en False e ingrese el tipo de intercalación deseado en Collation Name - elimina la necesidad de forzar la intercalación en su consulta.

+0

Esto no se recomienda sin pruebas de rendimiento, ya que puede alterar drásticamente su plan de consulta y dar lugar a consultas mucho más caras en comparación con la especificación de la intercalación en la consulta. En un caso, algo que tardaba 2 segundos con la intercalación especificada en la consulta tomó 2 minutos cuando se especificó la intercalación en el servidor vinculado. – tukushan

14

es necesario agregar la declaración collation en la parte de selección, así - no sólo en la cláusula donde - como la siguiente:

select a.field1 collate DATABASE_DEFAULT, b.otherfield from table1 a, table2 b 
where a.field1 collate DATABASE_DEFAULT = b.field3 
0

Su conflicto de intercalación puede desaparecer si se declara la #list tabla temporal como

CREATE TABLE #list 
(
record_num INT IDENTITY(1,1), 
TempAcctNum NVARCHAR(40) Collate Database_Default, 
TempAcctName NVARCHAR(100) Collate Database_Default, 
TempNumOfCrds SMALLINT, 
TempSys2Acct NVARCHAR(10) Collate Database_Default, 
TempDelType TINYINT, 
TempStatusOfCrd VARCHAR(100) Collate Database_Default, 
TempLastDate VARCHAR(100) Collate Database_Default, 
TempSys2Acct1 NVARCHAR(10) Collate Database_Default, 
TempShrtName NVARCHAR(50) Collate Database_Default, 
TempAdd1 NVARCHAR(200) Collate Database_Default, 
TempAdd2 NVARCHAR(200) Collate Database_Default, 
TempCity NVARCHAR(100) Collate Database_Default, 
TempState NVARCHAR(100) Collate Database_Default, 
TempZipCode NVARCHAR(50) Collate Database_Default, 
TempOpenDate DATETIME, 
TempFax NVARCHAR(50) Collate Database_Default, 
TempUsr1 NVARCHAR(100) Collate Database_Default, 
TempUsr2 NVARCHAR(100) Collate Database_Default, 
TempUsr3 NVARCHAR(100) Collate Database_Default, 
TempUsr4 NVARCHAR(100) Collate Database_Default, 
TempMemo NTEXT, 
TempMail NVARCHAR(100) Collate Database_Default, 
TempNoSys2Status NVARCHAR(50) Collate Database_Default, 
TempDelete BIT, 
TempEdit BIT, 
TempContName VARCHAR(200) Collate Database_Default, 
TempPhone NVARCHAR(50) Collate Database_Default 
) 
+0

Creo que esto puede ser de ayuda. –

Cuestiones relacionadas