我正在尝试将所有数据库标准化为单一排序规则 - 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 脚本来执行此操作的方法?
答案1
答案2
它可能需要进行一些调整,但我使用“SQL Server 2000 Collation Changer”实用程序已成功: http://www.codeproject.com/KB/database/ChangeCollation.aspx
答案3
不幸的是,这在 SQL Server 中不是一件容易的事。
您可以使用脚本工具(例如 Redgate 的 SQL Compare)来处理现有数据库对象(表、存储过程、视图等)。如果您没有许可证,可以使用免费试用版。使用正确的排序规则创建新数据库并从脚本重建对象后,您可以运行 SSIS 将数据从一个数据库传输到另一个数据库。如果您有大量数据,请使用 T-SQL 批量插入。
为了使该服务器上未来的数据库具有正确的排序规则,您可以更改服务器上的默认排序规则。以下 MSDN 文章解释了使用 ALTER DATABASE 和 ALTER TABLE 的 COLLATE 子句会有什么变化:
设置和更改数据库排序规则(SQL Server 2008 联机丛书)
您可以使用修改数据库语句。此语句不会更改任何现有用户定义表中列的排序规则。可以使用修改表。
更改数据库排序规则时,将更改以下内容:
- 数据库的默认排序规则。此新的默认排序规则将应用于数据库中随后创建的所有列、用户定义数据类型、变量和参数。在根据数据库中定义的对象解析 SQL 语句中指定的对象标识符时也会使用它。
- 系统表中的任何 char、varchar、text、nchar、nvarchar 或 ntext 列都将更改为新的排序规则。
- 存储过程和用户定义函数的所有现有 char、varchar、text、nchar、nvarchar 或 ntext 参数和标量返回值都将更改为新的排序规则。
- char、varchar、text、nchar、nvarchar 或 ntext 系统数据类型以及基于这些系统数据类型的所有用户定义数据类型都将更改为新的默认排序规则。
答案4
尝试这个实用程序例如,给定一个源数据库,将生成需要应用到目标数据库的所有脚本,以便安全地更改排序规则。