如何重置数据库中所有列的排序规则?

时间:2011-06-29 06:45:33

标签: sql sql-server collections

我需要重置数据库中所有表中所有列的排序规则: enter image description here

我想使用数据库的默认排序规则

我尝试在数据库属性下更改它: enter image description here

但是已经在列中设置了排序规则,这意味着我无法覆盖它

任何人都有可以为我做的脚本吗?

4 个答案:

答案 0 :(得分:3)

我已经把一个脚本组合在一起,应该做得足够好(希望如此)。在相应的数据库中运行脚本,结果为文本。然后复制&将输出粘贴到脚本窗口中以更改每列的排序规则:

declare @NewCollationName sysname
set @NewCollationName = 'Latin1_General_CS_AS'
select
    'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(st.schema_id)) + '.' + QUOTENAME(st.name) +
    ' ALTER COLUMN ' + QUOTENAME(sc.name) + ' ' + styp.name + '(' +
    CASE WHEN sc.max_length = -1 THEN 'max' ELSE CONVERT(varchar(10),sc.max_length) END +
    ') collate ' + @NewCollationName + '
    go
    '
from
    sys.columns sc
        inner join
    sys.tables st
        on
            sc.object_id = st.object_id
        inner join
    sys.types styp
        on
            sc.user_type_id = styp.user_type_id
where
    sc.collation_name is not null and
    OBJECTPROPERTY(st.object_id,N'IsMSShipped')=0

但有一点需要注意的是,如果列是约束的目标或由架构绑定对象(视图或函数)作为目标,则生成的脚本将不起作用。

在这种情况下,您必须编写依赖对象的脚本,从数据库中删除它们,然后运行上面脚本生成的脚本,最后重新添加依赖对象。

答案 1 :(得分:1)

请参阅(更改数据库整理)http://msdn.microsoft.com/en-us/library/ms174269.aspx

ALTER DATABASE database_name COLLATE collation_name

答案 2 :(得分:0)

重置列的最快方法是SET UNUSED该列,然后添加一个具有相同名称和数据类型的列。

这将是最快的方式,因为两个操作都不会触及实际的表(只有字典更新)。

将更改列的实际排序(重置列将是最后一列)。如果您的代码依赖于列的排序(它不应该!),您可以创建一个视图,该列将以正确的顺序排列(重命名表,创建与旧表同名的视图,从基表撤消授权,添加授权查看)。

SET UNUSED方法不会回收列使用的空间(而删除列将释放每个块中的空间)。

希望这有帮助。

答案 3 :(得分:0)

建议的脚本(可以找到here)用于遍历数据库中的所有表并将排序规则更改为所需的表。

它基于脚本:

ALTER TABLE TABLENAME ALTER COLUMN COLUMNNAME varchar(100) COLLATE Latin1_General_CI_AS NULL