更改 SQL Server 2012 数据库的排序规则

2024-04-14

更改排序规则

我需要更改特定服务器上的一个数据库的排序规则Latin1_General_CI_AS to SQL_Latin1_General_CP1_CI_AI以便它与我们数据库的其余部分相匹配。

问题

但是,当我尝试执行此操作时,出现以下错误:

更改数据库失败。数据库“XxxxxXxxxxx”的默认排序规则无法设置为 SQL_Latin1_General_CP1_CI_AI。 (微软 SQL Server,错误:5075)

我的研究

我对该主题的谷歌搜索显示了许多文章,这些文章表明我需要导出所有数据,删除数据库,使用正确的排序规则重新创建它,然后重新导入数据。

例如:数据库排序规则更改问题 (SQL Server 2008) https://stackoverflow.com/questions/7371234/problem-with-database-collation-change-sql-server-2008

显然,这是一项重要的任务,特别是因为必须保留主外键关系,而且我们的数据库非常大(超过一千万行数据)。

我的问题

有没有一种方法可以更改现有 SQL Server 2012 数据库的排序规则,而不需要导出和重新导入所有数据?

或者,是否有一些工具或脚本可以以可靠的方式自动执行此过程?


以下内容适用于 SQL Server 2012:

ALTER DATABASE CURRENT COLLATE SQL_Latin1_General_CP1_CI_AI;

链接问题中接受的答案并不完全正确,至少对于 SQL Server 2012 来说不正确。它说:

啊,这是 SQL Server 中最严重的问题之一:一旦创建了对象,就无法更改排序规则(对于表和数据库都是如此......)。

但我只能更改默认排序规则,并且我有已填充的表。 MSDN 页面修改数据库 http://technet.microsoft.com/en-us/library/ms174269(v=sql.110).aspx在“备注”部分的“更改数据库排序规则”下指出:

在将不同的排序规则应用于数据库之前,请确保满足以下条件:

  1. 您是当前唯一使用该数据库的人。

  2. 模式绑定对象不依赖于数据库的排序规则。

    如果数据库中存在以下依赖于数据库排序规则的对象,则 ALTER DATABASE数据库名称COLLATE 语句将失败。 SQL Server 将为每个阻止 ALTER 操作的对象返回一条错误消息:

    • 使用 SCHEMABINDING 创建的用户定义函数和视图。

    • 计算列。

    • 检查约束。

    • 返回包含字符列的表的表值函数,该表的排序规则继承自默认数据库排序规则。

因此,我建议确保数据库处于单用户模式,并且如果您有这四个项目中的任何一个,则:

  • 放下它们
  • 更改排序规则
  • 然后重新添加它们

BUT,此时所有已更改的是数据库的默认排序规则。用户表(即非系统表)中任何现有列的排序规则仍将具有原始排序规则。如果您想要现有的字符串列--CHAR, VARCHAR, NCHAR, NVARCHAR,以及已弃用的TEXT and NTEXT-- 要采用新的排序规则,您需要单独更改每一列。并且,如果在这些列上定义了任何索引,则需要首先删除这些索引(禁用还不够),然后在ALTER COLUMN(会阻止的其他依赖项ALTER COLUMN为了获得ALTER DATABASE上班)。下面的示例说明了这种行为:

测试设置

USE [tempdb];
SET NOCOUNT ON;

CREATE TABLE dbo.ChangeCollationParent
(
  [ChangeCollationParentID] INT NOT NULL IDENTITY(1, 1)
                    CONSTRAINT [PK_ChangeCollationParent]  PRIMARY KEY,
  ExtendedASCIIString VARCHAR(50) COLLATE Latin1_General_CI_AS NULL,
  UnicodeString NVARCHAR(50) COLLATE Latin1_General_CI_AS NULL
);

CREATE TABLE dbo.ChangeCollationChild
(
  [ChangeCollationChildID] INT NOT NULL IDENTITY(1, 1)
                    CONSTRAINT [PK_ChangeCollationChild]  PRIMARY KEY,
  [ChangeCollationParentID] INT NULL
                    CONSTRAINT [FK_ChangeCollationChild_ChangeCollationParent] FOREIGN KEY
                         REFERENCES dbo.ChangeCollationParent([ChangeCollationParentID]),
  ExtendedASCIIString VARCHAR(50) COLLATE Latin1_General_CI_AS NULL,
  UnicodeString NVARCHAR(50) COLLATE Latin1_General_CI_AS NULL
);

INSERT INTO dbo.ChangeCollationParent ([ExtendedASCIIString], [UnicodeString])
VALUES ('test1' + CHAR(200), N'test1' + NCHAR(200));
INSERT INTO dbo.ChangeCollationParent ([ExtendedASCIIString], [UnicodeString])
VALUES ('test2' + CHAR(170), N'test2' + NCHAR(170));


INSERT INTO dbo.ChangeCollationChild
         ([ChangeCollationParentID], [ExtendedASCIIString], [UnicodeString])
VALUES (1, 'testA ' + CHAR(200), N'testA ' + NCHAR(200));
INSERT INTO dbo.ChangeCollationChild
         ([ChangeCollationParentID], [ExtendedASCIIString], [UnicodeString])
VALUES (1, 'testB ' + CHAR(170), N'testB ' + NCHAR(170));

SELECT * FROM dbo.ChangeCollationParent;
SELECT * FROM dbo.ChangeCollationChild;

测试 1:更改没有依赖关系的列排序规则

ALTER TABLE dbo.ChangeCollationParent
  ALTER COLUMN [ExtendedASCIIString] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL;
ALTER TABLE dbo.ChangeCollationParent
  ALTER COLUMN [UnicodeString] NVARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL;

ALTER TABLE dbo.ChangeCollationChild
  ALTER COLUMN [ExtendedASCIIString] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL;
ALTER TABLE dbo.ChangeCollationChild
  ALTER COLUMN [UnicodeString] NVARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AI NULL;

SELECT * FROM dbo.ChangeCollationParent;
SELECT * FROM dbo.ChangeCollationChild;

The ALTER COLUMN上述语句成功完成。

测试 2:更改具有依赖关系的列排序规则

-- First, create an index:
CREATE NONCLUSTERED INDEX [IX_ChangeCollationParent_ExtendedASCIIString]
  ON dbo.ChangeCollationParent ([ExtendedASCIIString] ASC);

-- Next, change the Collation back to the original setting:
ALTER TABLE dbo.ChangeCollationParent
  ALTER COLUMN [ExtendedASCIIString] VARCHAR(50) COLLATE Latin1_General_CI_AS NULL;

这一次,ALTER COLUMN声明收到以下错误:

消息 5074,16 级,状态 1,第 60 行
索引“IX_ChangeCollat​​ionParent_ExtendedASCIIString”依赖于列“ExtendedASCIIString”。
消息 4922,16 级,状态 9,第 60 行
ALTER TABLE ALTER COLUMN ExtendedASCIIString 失败,因为一个或多个对象访问此列。

ALSO,请注意,数据库范围的系统目录视图中某些字符串列的排序规则(例如sys.objects, sys.columns, sys.indexes等)将更改为新的排序规则。如果您的代码具有与任何这些字符串列的联接(即name),那么您可能会开始收到排序规则不匹配错误,直到您更改用户表中连接列的排序规则。

UPDATE:

如果更改整个实例的排序规则是您的愿望或选择,那么有一种更简单的方法可以绕过所有这些限制。它没有文档记录,因此不受支持(所以如果它不起作用,微软不会提供帮助)。但是,它会更改所有级别的排序规则:实例、所有数据库以及所有用户表中的所有字符串列。它通过简单地更新表的元数据等来获得新的排序规则来做到这一点,并避免所有典型的限制。然后,它删除并重新创建具有字符串列的所有索引。此方法还有一些细微差别,可能会产生影响,但可以修复。这个方法是-q命令行开关sqlservr.exe。我在以下帖子中记录了所有行为,包括通过进行如此广泛的排序规则更改来列出所有可能受影响的区域:

更改实例、数据库和所有用户数据库中所有列的排序规则:可能会出现什么问题? https://sqlquantumleap.com/2018/06/11/changing-the-collation-of-the-instance-and-all-columns-across-all-user-databases-what-could-possibly-go-wrong/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 SQL Server 2012 数据库的排序规则 的相关文章

随机推荐

  • Android:设置自定义字体时出现异常

    自一小时以来 我一直在绞尽脑汁地从代码中设置自定义字体到文本 我已经在之前的项目中做到了这一点 而且它有效 但我不知道出于什么原因 它给了我例外 无法制作原生字体 在这里 我已经解决了许多与此相关的问题 并尝试了建议的解决方案并适用于这些情
  • 是否可以从我自己的 AoG 应用程序的实现中触发另一个 Actions on Google 应用程序? [复制]

    这个问题在这里已经有答案了 此问题专门与 Google Apps 上的操作有关 涉及触发事件 操作以使助手为最终用户选择另一个 AoG 应用程序的能力 专门用于触发其他人的 AoG 应用程序 而不是您编写的应用程序 Idea 我想创建一个自
  • 轴位于中心的 R 图

    默认情况下 R 中的笛卡尔轴位于图的底部和左侧 如何使轴居中 如下图所示 Example using data generated by bgoldst estimate curve x lt seq 1 1 5 0 1 y lt c 1
  • 使用 Hibernate 映射双向列表

    我不明白映射双向列表时 Hibernate 的行为 Hibernate 生成的 SQL 语句对我来说似乎不是最佳的 有人可以启发我吗 场景如下 我有一对多的父子关系 我用双向列表来映射这种关系 根据Hibernate 注解参考指南 http
  • AngularJS:如何在模板内设置变量?

    我怎样才能避免 f 第三行语句打印出内容forecast day iso 我想避免使用forecast day iso temperature每次迭代依此类推 div index day iso day name f forecast da
  • IE9 文本渲染问题 - 字母尾部被切断

    我遇到了一个问题 在 IE9 标准模式下 IE9 以降序字母的尾部 q p y 等 消失的方式呈现文本 已尝试使用填充和其他常见的 CSS 设置来帮助解决此问题 但到目前为止我还没有运气 谁知道这可能是什么 EDIT 我在博客上找到了这个
  • Glassfish 3.1.1:在 RESTful Web 服务中检索 HTTP 身份验证

    我正在使用基于我的客户表的 HTTP 身份验证 用户通过身份验证后 将调用静态 Web 服务 但是我如何在 Web 服务中访问 HTTP 身份验证 HttpRequest 的标头数据 我的代码如下所示 GET Path id Produce
  • 战舰人工智能在一定规则下沉没部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在寻找在某些规则下是否可以为战舰沉
  • 使用 msbuild 扩展包验证文件夹是否存在?

    如何使用 msbuild 扩展包任务可靠地验证文件夹是否存在 我怎样才能做到这一点而不引发错误并停止构建 您可以在目标上使用 Exists 条件吗 仅当与 msbuild 文件位于同一目录中存在名为 Testing 的目录或文件时 才会执行
  • 如何循环访问类的属性?

    C 有没有办法循环遍历类的属性 基本上我有一个包含大量属性的类 它基本上保存大型数据库查询的结果 我需要将这些结果输出为 CSV 文件 因此需要将每个值附加到一个字符串中 最明显的方法是将每个值手动附加到字符串中 但是有没有一种方法可以有效
  • 如何对一组和进行求和? SQL Server 2008

    我有一个查询sum像这样 SELECT Table1 ID SUM Table2 Number1 Table2 Number2 AS SumColumn FROM Table1 INNER JOIN Table3 ON Table1 ID
  • 如何在 Spring Hibernate 运行时设置数据库名称

    问题描述 Spring中有一个类叫做AbstractRoutingDataSource这将适合您的要求 浏览文档 您将找到一些有关如何实现具体类的帮助 您需要更改 或添加 现有代码的某些部分才能配置动态Data source 这个博客 ht
  • 在数据库中实施审查标志;最佳实践

    我需要存储一些与某些实体相关的评论标志 每个审核标志只能与单个实体属性组相关 例如表Parents has a ParentsStatus旗帜和桌子Children有一组ChildrenStatus flags 在当前的设计方案中 我有三个
  • 保留大小相等的分割视图

    我在非最大化窗口模式下启动 GVIM 并水平分割其窗口 确保窗口大小相等 当我最大化主 GVIM 窗口时 如何保留这个大小相等的分割视图 每当我最大化 GVIM 时 都会忘记窗口已被平均分割 Thanks 均衡分割的命令是 W ctrl W
  • 使自定义图像尊重tintColor属性iOS

    我必须想象这个问题已经被问过好几次了 但我的问题措辞一定不正确 我有自己在 Photoshop 中制作的自定义图像 并将其设置为按钮的图像属性 这里正常显示 背景是透明的 但它是 44x44 其中三个点是 88x88 像素的 png 文件
  • 使用 CSS 时链接不起作用

    我遇到了一个无法通过谷歌搜索解决的问题 我有一个静态 HTML
  • 一个关于二分查找的问题

    为什么人们通常使用二分搜索而不是三重搜索 将 每次分成三份 或者甚至每次分成十份 因为二分查找会产生最少数量的比较和查找 为了简单直观 请考虑每次分为 4 部分 v1 v2 v3 您现在已经完成了 3 次查找 并且必须将您正在搜索的最坏值与
  • 使用实体框架代码优先的 FSharp 记录类型

    我正在一个业务应用程序中进行概念验证 我想用 F 替换当前的 C 代码优先实体框架实现 我正在关注this http blogs msdn com b visualstudio archive 2011 04 04 f code first
  • 干净的架构,用例依赖关系

    最近 我找到了方法干净的架构 https 8thlight com blog uncle bob 2012 08 13 the clean architecture html鲍勃叔叔的帖子 但是 当我尝试将其应用到当前项目时 当一个用例需要
  • 更改 SQL Server 2012 数据库的排序规则

    更改排序规则 我需要更改特定服务器上的一个数据库的排序规则Latin1 General CI AS to SQL Latin1 General CP1 CI AI以便它与我们数据库的其余部分相匹配 问题 但是 当我尝试执行此操作时 出现以下