SQL Server - 在1个数据库上更改数据库排序规则的最佳策略(不更改服务器默认值)

时间:2012-06-08 07:32:46

标签: sql-server-2008

问题:有没有一种有效的方法来切换SQL Server中1个数据库的整理?

我通过属性设置了数据库的排序规则 - >选项 - >排序规则。尽管为新字段设置了此排序规则,但数据库中现有的基于文本的字段均未更改。这就是我需要完成的工作。

我需要切换排序规则的数据库很大(50 + GB,750 +表),因此无法手动更改数据库中的所有字段。

以下内容如何:

  • 为数据库结构创建脚本
  • 导出所有数据
  • 删除数据库
  • 使用正确的排序规则创建一个空数据库
  • 创建数据库结构 - 现在应该设置所有基于文本的字段 到数据库默认
  • 导入数据
  • Bada bing,bada boom?

其他策略?

我可以查询master数据库并更改那里的排序规则吗?

感谢您的投入!

2 个答案:

答案 0 :(得分:1)

之前我遇到过这个问题,我找到的唯一方法就是save-drop-load并填充该数据库。

另外,我猜你已经浏览了这个page

答案 1 :(得分:0)

你可以设想创建一堆查询,这些查询会生成像“Alter table [schema]。[TableName] alter column [ColName] [type] collat​​e [New Collat​​ion] [nullability]”这样的行作为输出。这可以使用内置的sys.Schemas,sys.Tables和sys.Columns系统视图来完成。

样品:

select 'alter table [' + s.name + '].[' + t.name + '] alter column [' + c.name 
    + '] nvarchar(' + CAST(c.max_length/2 as nvarchar) +') ' 
    + ' collate Finnish_Swedish_CI_AI ' 
    + (case when c.is_nullable = 1 then ' null ' else ' not null ' end) 
from sys.tables t
    join sys.schemas s on t.schema_id = s.schema_id
    join sys.columns c on t.object_id = c.object_id
where t.type='U' and c.system_type_id = 231

该示例将找到nvarchar([length])类型的列,并生成alter语句以将排序规则更改为Finnish_Swedish_CI_AI。

请注意,此示例仅用作概念证明。如果您想探索这种可能的解决方案,您必须花一些时间研究上述系统视图。

您可能必须单独查询以处理nvarchar,nchar,ntext和varchar,char,文本字段。 Nvarchar / Varchar(max)字段可能需要特别考虑,以及任何可能的字符类型计算列。