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

6
我需要重置数据库中所有表的所有列的排序规则: enter image description here 我想使用数据库的默认排序规则。
我尝试在数据库属性下更改它: enter image description here 但是,由于列已经设置了排序规则,这意味着我无法覆盖它。
有没有脚本可以帮我完成这个操作?
4个回答

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

关于更改列排序规则,请参考以下链接:http://msdn.microsoft.com/zh-cn/library/ms190273.aspx - Dan D.
但是我需要为每个列执行此操作(很多工作),我想问问是否有人有自动执行此操作的脚本。 - Sasha
如果该列存在依赖项,例如索引或全文搜索,则此方法无法使用。 - David

0

一个提议的脚本(可以在这里找到)旨在遍历您的数据库中的所有表并将校对更改为所需的校对。

它基于脚本:

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

0

重置列的最快方法是将该列设置为未使用,然后添加一个具有相同名称和数据类型的列。

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

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

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

希望这能帮到您。


你能否提供更详细的信息,例如实际脚本,包括如何将数据从旧列传输到新列(如果需要)? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接