代码之家  ›  专栏  ›  技术社区  ›  Andrew G. Johnson

在SQL Server上跨两个具有不同排序规则的数据库执行联接并获取错误信息

  •  55
  • Andrew G. Johnson  · 技术社区  · 15 年前

    我知道,我知道我在问题中写了什么,我不应该感到惊讶。但是我的情况是在一个继承的POS系统上缓慢工作,我的前任显然不知道连接,所以当我查看一个内部页面加载60秒时,我发现这是一个相当快的过程,将这8个查询重写为一个带有连接情况的查询。问题是,除了不知道连接之外,他似乎还迷恋多个数据库和惊喜,惊讶于它们使用不同的排序规则。事实上,我们使用所有的“正常”拉丁字符,说英语的人会考虑整个字母表,这整个东西将在几个月内停止使用,所以我只需要一个创可贴。

    长话短说,我需要某种方法强制转换为单个排序规则,以便比较两个数据库中的两个字段。

    准确的误差是:

    无法解决排序规则冲突 之间 “SQL拉丁1”和 中的“SQL拉丁语通用词” 等于操作。

    2 回复  |  直到 11 年前
        1
  •  112
  •   Ray    15 年前

    您可以在查询中使用collate子句(我现在找不到我的示例,所以我的语法可能是错误的-我希望它为您指明了正确的方向)

    select sone_field collate SQL_Latin1_General_CP850_CI_AI
      from table_1
        inner join table_2
          on (table_1.field collate SQL_Latin1_General_CP850_CI_AI = table_2.field)
      where whatever
    
        2
  •  53
  •   gbn    14 年前

    一种通用的方法是将排序规则强制为数据库默认值。这将删除可能更改的排序规则名称的硬编码。

    对于临时表和表变量,以及可能不知道服务器排序规则的地方(例如,您是将系统放置在客户服务器上的供应商),它也很有用。

    select
        sone_field collate DATABASE_DEFAULT
    from
        table_1
        inner join
        table_2 on table_1.field collate DATABASE_DEFAULT = table_2.field
    where whatever