【问题标题】:SQL conflict between collation排序规则之间的 SQL 冲突
【发布时间】:2016-09-01 15:25:05
【问题描述】:

我有这个错误Cannot resolve the collation conflict between "Latin1_General_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.,我无法解决这个问题

代码如下:

SELECT *
FROM [LinhaRI] LR
WHERE IDdocumento IN
(
    SELECT st.design COLLATE Latin1_General_CI_AS
    FROM [admnappl001].[cebi1].[dbo].[st] st
    WHERE st.ststamp = LR.STstamp_Artigo
);

【问题讨论】:

  • 我们也不能,因为您的问题中没有代码
  • 我建议您更改列的排序规则(alter column .. collat​​e),使所有字符字段都具有相同的排序规则。修复比较运算符并不是最好的解决方案。
  • @Irdis 这可能不是一个选项:admnappl001 是一个链接服务器,我们可能无法控制那里的排序规则,也有理由不在本地服务器上更改它。
  • 是的,因为我已经在 pass 中使用了类似的代码并且工作正常,我只更改了数据库和字段的名称

标签: sql-server collation


【解决方案1】:

就在你的街道上:Difference between collation SQL_Latin1_General_CP1_CI_AS and Latin1_General_CI_AS

比较时有排序规则冲突

[LinhaRI].[STstamp_Artigo] to [admnappl001].[cebi1].[dbo].[st].[ststamp]
or
[LinhaRI].[IDdocumento]    to [admnappl001].[cebi1].[dbo].[st].[design]

您需要检查所有涉及的列的排序规则。您可以尝试在每次比较时强制执行:

SELECT *
FROM [LinhaRI] LR
WHERE IDdocumento COLLATE Latin1_General_CI_AS IN
(
    SELECT st.design COLLATE Latin1_General_CI_AS
    FROM [admnappl001].[cebi1].[dbo].[st] st
    WHERE st.ststamp = LR.STstamp_Artigo COLLATE Latin1_General_CI_AS
);

【讨论】:

  • 当我使用你的代码时出现一个错误,就像这个“表达式类型 int 对于 COLLATE 子句无效。”
  • @ThiagoSchettiniMari [STstamp_Artigo]、[stamp]、[IDdocumento]、[design] 字段有哪些类型?
  • [IDdocumento]、[STstamp_artigo] 和 [stamp] 是整数,而 [design] 是字符串
  • @ThiagoSchettiniMari 你怎么有int [IDdocumento] IN str [design]?看来您可以只 CAST(st.design AS INT) 并完全避免任何与整理相关的问题。
  • 因为 then 属于同一张表,所以 IDdocumento 是一个 PK,而 design 是一个 item 的名称
猜你喜欢
  • 2018-03-20
  • 1970-01-01
  • 2010-10-07
  • 2012-01-21
  • 2020-06-09
  • 2019-03-07
  • 2011-04-17
  • 2014-02-15
  • 1970-01-01
相关资源
最近更新 更多