联合选择无法解决排序规则冲突

时间:2010-04-20 08:36:38

标签: sql sql-server-2005

我有两个问题:

首先不起作用:

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

因为我收到错误:

Cannot resolve collation conflict for column 1 in SELECT statement.

第二部作品:

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

结构:

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

DuplicatedObjects.duplicatetargetCode PK nvarchar(100)

4 个答案:

答案 0 :(得分:16)

您还需要在select部分中添加collation语句 - 不仅在where子句中 - 如下所示:

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

答案 1 :(得分:9)

在两个表上使用sp_help。 hotels.TargetCode上的排序规则与DuplicatedObjects.duplicateTargetCode上的排序规则不同,因此数据库不知道如何处理结果UNION

您可以在其中一个上强制执行新的排序规则以匹配另一个排序规则,或将结果放入预定义的临时表/表中,该表将定义一个排序规则。

编辑:您可以使用类似......

之类的内容覆盖现有的排序规则
DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS

...在查询中。这将使用duplicateTargetCode和排序规则SQL_Latin1_General_CP1_CI_AS。您应该选择与hotels.TargetCode匹配的排序规则。

答案 2 :(得分:2)

即使您的语法正确,尝试在加入链接服务器时在查询中设置排序规则仍然可能会失败Incorrect syntax near 'COLLATE'

解决方案:在“链接服务器属性”中,将Use Remote Collation设置为False,然后在Collation Name中输入所需的排序规则类型 - 删除需要在查询中强制排序规则。

答案 3 :(得分:0)

如果将临时表#list声明为

,则排序规则冲突可能会消失
 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
 )