2010-04-20 115 views
10

我有两个疑问:无法解析在联盟的排序规则冲突选择

首先不起作用:

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) 
+1

C#在这里有什么相关性? – 2010-04-20 08:39:08

+0

@John Skeet我已经纠正了它 – user278618 2010-04-20 08:43:43

回答

9

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

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

编辑:您可以使用类似覆盖现有的整理...

DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS 

...查询。这将使用带有排序规则SQL_Latin1_General_CP1_CI_AS的duplicateTargetCode。您应该选择一个与hotels.TargetCode匹配的排序规则。

2

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

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

+0

这不建议不进行性能测试,因为它可以彻底改变您的查询计划,并导致比查询中指定排序规则更昂贵的查询。在一种情况下,在链接服务器上指定排序规则时,查询中指定的排序规则需要2秒的时间花了2分钟。 – tukushan 2013-04-09 23:43:04

14

您需要添加在选择部分collation声明以及 - 不仅在where子句 - 类似如下:

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

如果你声明的临时表#list你的排序规则冲突可能消失as

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

我认为这可以帮助你 – 2016-01-06 04:53:33

相关问题