【问题标题】:Cannot resolve collation conflict in Union select无法解决联合选择中的排序规则冲突
【发布时间】:2010-04-20 08:36:38
【问题描述】:

我有两个查询:

第一个不起作用:

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)

【问题讨论】:

  • 这里C#的相关性是什么?
  • @John Skeet 我已经更正了

标签: sql sql-server-2005


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    编辑:您可以使用类似...的东西覆盖现有的排序规则

    DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS
    

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

    【讨论】:

      【解决方案3】:

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

      解决方案:在 Linked Server Properties 中,将 Use Remote Collation 设置为 False,并在 Collation Name 中输入所需的排序规则类型 - 无需在查询中强制排序规则。

      【讨论】:

      • 在没有性能测试的情况下不建议这样做,因为与在查询中指定排序规则相比,它会极大地改变您的查询计划并导致更昂贵的查询。在一种情况下,在链接服务器上指定排序规则时,查询中指定排序规则需要 2 秒的时间。
      【解决方案4】:

      如果您将临时表 #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
       ) 
      

      【讨论】:

      • 我认为这对你有帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2020-11-23
      • 2014-02-15
      • 2016-01-04
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多