【问题标题】:Cannot resolve the collation conflict error with Temp Table无法解决临时表的排序规则冲突错误
【发布时间】:2019-06-27 16:54:34
【问题描述】:

我正在尝试列出数据库中缺少的一些记录,as described in my unanswered question here

我现在正在尝试用应检查的数据填充临时表,并将其与数据库中的数据进行比较。我的查询如下:

create table #Temp
(
    Component nvarchar(50),
    AssetType nvarchar(50)
)

Insert Into #Temp (Component, AssetType) VALUES
  ('0990.LB00.000.06', '0738.D100.M00.60_03.03'),
  ('0738.D100.L00.55', '9211.D108.D07.01_02.02');


WITH DBD AS (
            Select distinct C.Code Comp, AT.Code AssetType From astComponents C
            Join astAssetTypes AT ON AT.Id = C.AssetTypeId
            Where (C.Code = '0990.LB00.000.06' And AT.Code = '0738.D100.M00.60_03.03') OR (C.Code = '0738.D100.L00.55' And AT.Code = '9211.D108.D07.01_02.02')
            ),
     Compare AS 
            (
            Select T.* FROM #Temp T
            Left Join DBD ON DBD.Comp = T.Component AND DBD.AssetType = T.AssetType
            Where DBD.Comp is null
            )

Select * From Compare

预期输出如下,因为数据库中不存在这种组件-资产类型组合

Component             Asset Type
0990.LB00.000.06      0738.D100.M00.60_03.03

但是,我遇到了错误

消息 468,第 16 级,状态 9,第 22 行
无法解决等于操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_BIN”之间的排序规则冲突。

【问题讨论】:

  • 您是否尝试搜索该特定错误消息?这很清楚。您需要匹配两个排序规则才能在字符串类型之间进行任何类型的比较。
  • 问题表达方式是什么?
  • @EzLo 我做到了,但我仍然是一个 SQL 新手,无法正确理解解决方案的确切含义。你建议我做什么,我认为这与设置临时表有关?
  • @jarlh 这是 CTE,尤其是 Left Join
  • 该问题表明您的表格设计不一致。应该比较的列应该用相同的排序规则声明。 (通常。)

标签: sql sql-server common-table-expression


【解决方案1】:

排序规则定义了一种比较字符串的方法。每当您在字符串类型之间进行比较(排序也需要比较)时,您需要应用相同的标准,这就是排序规则类型。

CREATE TABLE #StringLatin (
    String VARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS)

CREATE TABLE #StringBIN (
    String VARCHAR(100) COLLATE Latin1_General_BIN)

SELECT
    'Oops!!!'
FROM
    #StringLatin AS L
    INNER JOIN #StringBIN AS B ON L.String = B.String

消息 468,级别 16,状态 9,第 5 行无法解析排序规则 “Latin1_General_BIN”和 “SQL_Latin1_General_CP1_CI_AS”中的等于操作。

这里的问题是L.String = B.String,因为两者都是使用不同的排序规则类型创建的。

您可以通过在表的创建语句中更改排序规则(因此它匹配您以后加入的任何一个)或直接在比较中,在SELECT 中解决此问题。

SELECT
    'Works'
FROM
    #StringLatin AS L
    INNER JOIN #StringBIN AS B ON L.String = B.String COLLATE SQL_Latin1_General_CP1_CI_AS

默认排序规则可以从服务器更改为服务器,它将影响所有未指定特定排序规则的表,这在使用不同的数据库时可能会带来麻烦。要查找您可以使用的默认排序规则:

SELECT SERVERPROPERTY('collation');

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多