【问题标题】:change collation on all objects in a database更改数据库中所有对象的排序规则
【发布时间】:2014-08-29 11:14:23
【问题描述】:

我需要更改已还原数据库的排序规则以匹配服务器和 tempdb 数据库。我知道我可以使用 ALTER DATABASE 和 ALTER TABLE 来更改排序规则。但它只会影响添加到表中的新数据吗?我必须和

一起走下去吗?
  • 重新创建用户数据库及其中的所有对象所需的脚本
  • 使用 bcp Utility 等工具导出所有数据
  • 创建一个新数据库
  • 为右侧集合中的表格编写脚本并导入所有数据。

这是 Microsoft Sql Server 2008

【问题讨论】:

  • Alter COLUMN 将更改现有数据的排序规则,但您不能拥有引用该列的索引/约束。我认为导出/导入方法是最干净的,但您可以在同一个数据库中创建新对象、迁移数据、删除旧表并重命名。
  • @DanGuzman-SQLServerMVP:如果(旧)表被其他表引用,您是否还需要删除外键(然后重新创建它们)?
  • 是的,同样的考虑也适用于外键约束。

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

我使用了这个脚本:

DECLARE @collation NVARCHAR(64)
SET @collation = 'Latin1_General_CI_AS'

SELECT
    'ALTER TABLE [' + TABLE_SCHEMA  + '].[' + TABLE_NAME + '] '
  + 'ALTER COLUMN [' + COLUMN_NAME + '] '
  + DATA_TYPE + '(' + CASE CHARACTER_MAXIMUM_LENGTH 
        WHEN -1 THEN 'MAX' 
        ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) END + ') '
  + 'COLLATE ' + @collation + ' '
  + CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE 'NULL' END
FROM INFORMATION_SCHEMA.columns
WHERE  COLLATION_NAME IS NOT NULL
AND TABLE_NAME IN ( SELECT TABLE_NAME from information_schema.tables WHERE table_type = 'BASE TABLE'  )
AND COLLATION_NAME <> @collation

同时检查Set or Change the Database Collation

【讨论】:

  • 请注意,如果索引、主键约束或唯一约束引用列,则 ALTER COLUMN 将失败。
猜你喜欢
  • 2013-05-19
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 2019-01-24
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多