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

我试图在单个归类中标准化所有数据库 – Latin1_General_CI_AS(标准归类)。 我有一些数据库在SQL_Latin1_General_CP1_CI_AS。

我知道我可以使用ALTER DATABASE来更改数据库sorting规则,但只影响新的对象。 我的理解是,改变现有列的唯一方法是在每个表中的每一列上执行ALTER COLUMN – 我需要删除并重新创build所有索引。

我想它会看起来像这样:

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脚本。

有没有更简单的方法来做到这一点,或者任何人都可以build议一种方法来自动创build一个SQL脚本来做到这一点?

MS KB 325335有关于如何为整个数据库和所有列执行此操作的选项。

基本上:

  1. 脚本数据库表(使用新的整理)
  2. DTS / SSIS数据(收看整理)
  3. 添加约束

它可能需要一些调整,但我已经成功使用“SQL Server 2000sorting规则更改”实用工具: http : //www.codeproject.com/KB/database/ChangeCollat​​ion.aspx

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

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

为了在该服务器上为将来的数据库提供正确的sorting规则,可以更改服务器上的默认sorting规则。 以下MSDN文章解释了使用ALTER DATABASE和ALTER TABLE的COLLATE子句进行的更改:

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

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

更改数据库sorting规则时,更改以下内容:

  • 数据库的默认sorting规则。 这个新的默认sorting规则适用于随后在数据库中创build的所有列,用户定义的数据types,variables和参数。 在parsing数据库中定义的对象的SQL语句中指定的对象标识符时也使用它。
  • 系统表中的任何char,varchar,text,nchar,nvarchar或ntext列都会更改为新的归类。
  • 存储过程和用户​​定义函数的所有现有char,varchar,text,nchar,nvarchar或ntext参数和标量返回值都将更改为新的sorting规则。
  • char,varchar,text,nchar,nvarchar或ntext系统数据types以及基于这些系统数据types的所有用户定义的数据types将更改为新的默认归类。

一般不build议这样做到现场服务器。 上次我看,这样做并没有得到微软官方的支持。 要在实践中做到这一点,你必须创build一个新的实例与正确的sorting规则,并将数据库迁移到它。

将数据库还原到具有不同默认sorting规则的服务器会导致各种各样的乐趣,因为tempdb将有新服务器的sorting规则,因此也不build议这样做。

尝试这个实用程序 ,给定一个源数据库将生成所有需要应用在目标数据库上的脚本,因此整理是安全地更改。

您可以使用Infomation_Schema视图轻松生成脚本,但我不确定这是解决问题的最佳方法。 重新创build大型数据库的所有索引可能需要大量的时间/日志空间等。我会去迁移(不恢复)到一个新的实例。