AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 47568
Accepted
Christian Hayter
Christian Hayter
Asked: 2009-07-30 06:09:43 +0800 CST2009-07-30 06:09:43 +0800 CST 2009-07-30 06:09:43 +0800 CST

有没有比更改每一列更简单的方法来解决 SQL Server/数据库排序规则不匹配?

  • 772

免责声明:我知道这个问题之前已经被问过一百次了,但我只是想检查一下在我继续编写/获取大量代码来做之前,我可能错过了一个更简单的解决方案。

我们的软件使用最初为 SQL Server 7 设计的数据库,因此,创建它的所有脚本都没有为任何字符列指定任何显式排序规则。相反,当数据库创建/恢复到 SQL Server 2000 或更高版本时,每一列都会继承数据库排序规则(这恰好是SQL_Latin1_General_CP1_CI_AS因为这是 SQL Server 7 的默认设置)。

从理论上讲,这无关紧要,因为如果我们的数据库是在客户的服务器上从头开始创建的,它会继承客户的服务器排序规则(这通常是现代安装默认设置Latin1_General_CP1_CI_AS),并且一切正常。但是,当他们向我们发送数据库备份或我们向他们发送数据库备份时,这种情况就会崩溃,并且每当代码尝试访问临时表等时,我们或他们都会收到可怕的排序规则不匹配错误。

我们已经尝试教育客户安装或重建他们的 SQL Server 实例以使用我们首选的排序规则,但当然这并不总是发生,而且并不总是可能的。

涉及创建新数据库和复制数据的解决方案对我们来说并不实用,我们需要一根“魔杖”,我们可以在实时数据库中挥动它以在不干扰数据的情况下就地纠正所有列。我正在考虑编写一个实用程序来执行此操作,但由于这将是一项相当大的工作,有没有人有任何更简单的建议?

sql-server sql
  • 3 3 个回答
  • 3645 Views

3 个回答

  • Voted
  1. Best Answer
    gbn
    2009-07-30T07:37:02+08:002009-07-30T07:37:02+08:00

    一种选择是“证明”您的代码免受排序规则不匹配的影响。

    您可以使用特殊排序规则“DATABASE_DEFAULT”来强制执行,而无需知道实际排序规则是什么。您可以在需要使用的临时表、表变量和系统表中的 char 类型列上使用它。

    例子:

    CREATE TABLE #Currency (CCY CHAR(3))
    GO
    INSERT #Currency VALUES ('GBP')
    INSERT #Currency VALUES ('CHF')
    INSERT #Currency VALUES ('EUR')
    GO
    SELECT Something
    FROM myTable M JOIN #Currency C ON M.CCY = C.CCY --error!
    GO
    -- in join too
    SELECT Something
    FROM myTable M JOIN #Currency C ON M.CCY = C.CCY COLLATE DATABASE_DEFAULT --no error
    GO
    DROP TABLE #Currency
    GO
    
    
    CREATE TABLE  #Currency (CCY CHAR(3) COLLATE DATABASE_DEFAULT)
    GO
    INSERT #Currency VALUES ('GBP')
    INSERT #Currency VALUES ('CHF')
    INSERT #Currency VALUES ('EUR')
    GO
    SELECT Something
    FROM myTable M JOIN #Currency C ON M.CCY = C.CCY --no error!
    GO
    
    DROP TABLE #Currency
    GO
    

    这也意味着当您的客户将他们的数据库迁移到具有另一种不同排序规则的新 SQL Server 机器上时,它也可以工作......

    • 6
  2. SpaceManSpiff
    2009-07-30T07:08:11+08:002009-07-30T07:08:11+08:00

    简短的回答是没有简单的方法。我过去也遇到过同样的问题。

    我要说的是两件事,首先,当您的客户向您发送一个带有意外排序规则的数据库时,安装一个具有与其数据库匹配的默认排序规则的新 SQL 实例,并在其中使用它。

    第二个是确保您的应用程序将与其他排序规则一起使用,然后是默认值(因为将来可能会更改)并且只要 SQL 服务器和数据库上的排序规则匹配就可以正常工作。然后很容易让客户安装具有与其数据库匹配的排序规则的 SQL 服务器,然后就可以工作了。

    或者编写一个实用程序来更新数据库中的所有表等,但这可能比你想要的要多。

    • 2
  3. David Spillett
    2009-07-30T07:38:46+08:002009-07-30T07:38:46+08:00

    如果数据库中的所有列都具有相同的排序规则,那么它只会在进行跨数据库查询时给您带来问题(或者您的应用程序对排序顺序敏感)。

    当您意识到加入临时表是跨数据库的时,问题就出现了,就像它们在 tempdb 中一样。不过,这很容易排序 - 只需确保临时表中的任何文本列都是使用COLLATE database_default指令显式创建的。这意味着将使用当前数据库的默认排序规则创建列,而不是使用 tempdb 的默认集合(与服务器的默认集合相同)。

    • 2

相关问题

  • 远程连接到 LAN 内的 SQL 服务器

  • 如何提高 SQL Server 镜像性能

  • OPENROWSET、二进制文件、varchars 和 varbinaries

  • 聚集索引与非聚集索引?

  • 开源与专有关系 db mgt 系统的优缺点是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve