如何更改SQL Server数据库的排序规则?


16

我正在尝试在一个归类-Latin1_General_CI_AS(标准归类)上标准化所有数据库。我有一些SQL_Latin1_General_CP1_CI_AS中的数据库。

我知道我可以使用ALTER DATABASE更改数据库排序规则,但这只会影响新对象。我的理解是,更改现有列的唯一方法是在每个表的每个列上执行ALTER COLUMN-我需要删除并重新创建所有索引才能做到这一点。

我想它看起来像这样:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

并对整个数据库中的每个varchar,char,text,nvarchar,nchar和ntext列重复一次。那将是一个巨大的 SQL脚本。

有没有更简单的方法可以执行此操作,或者有人可以建议自动创建SQL脚本的方法吗?

Answers:


9

MS KB 325335提供了有关如何针对整个数据库和所有列执行此操作的选项。

基本上:

  1. 脚本数据库表(具有新的排序规则)
  2. DTS / SSIS数据(观看整理)
  3. 添加约束


2

不幸的是,这在SQL Server中并不是一件容易的事。

您可以对现有的数据库对象(表,存储过程,视图等)使用Redgate的SQL Compare之类的脚本工具。如果您没有许可证,则可以使用免费试用版。在使用正确的排序规则创建新数据库并从脚本中重建对象之后,可以运行SSIS将数据从一个数据库传输到另一个数据库。如果您有大量数据,请使用T-SQL批量插入。

为了使该服务器上的将来数据库具有正确的排序规则,可以更改服务器上的默认排序规则。以下MSDN文章介绍了使用ALTER DATABASE和ALTER TABLE的COLLATE子句进行的更改:

设置和更改数据库排序规则(SQL Server 2008联机丛书)

您可以使用ALTER DATABASE语句的COLLATE子句更改在用户数据库中创建的任何新对象的排序规则。该语句不会更改任何现有用户定义表中列的排序规则。这些可以通过使用ALTER TABLE的COLLATE子句进行更改

更改数据库排序规则时,将更改以下内容:

  • 数据库的默认排序规则。此新的默认排序规则将应用于随后在数据库中创建的所有列,用户定义的数据类型,变量和参数。当针对数据库中定义的对象解析SQL语句中指定的对象标识符时,也可以使用它。
  • 系统表中的所有char,varchar,text,nchar,nvarchar或ntext列均更改为新的排序规则。
  • 存储过程和用户​​定义函数的所有现有char,varchar,text,nchar,nvarchar或ntext参数以及标量返回值都更改为新的排序规则。
  • char,varchar,text,nchar,nvarchar或ntext系统数据类型以及基于这些系统数据类型的所有用户定义的数据类型均更改为新的默认归类。

1

通常,不建议对活动服务器执行此操作。我上次查看时,Microsoft不正式支持这样做。为了在实践中做到这一点,您必须使用正确的排序规则创建一个新实例,然后将数据库迁移到该实例。

将数据库还原到具有不同默认排序规则的服务器时,会产生各种乐趣,因为tempdb将具有新服务器的排序规则,因此也不建议这样做。



1

您可以使用Infomation_Schema视图足够容易地生成脚本,但是我不确定这是否是解决问题的最佳方法。在较大的数据库上重新创建所有索引可能会花费大量时间/日志空间,等等。我会迁移(而不是还原)到新实例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.