2011-06-29 48 views
4

我需要在数据库中的所有表中的所有列重新归类: ​​如何重置数据库中所有列的排序规则?

我想用数据库的默认排序

我试图改变它在数据库属性: enter image description here

但整理已列在列中,这意味着我不能覆盖它

任何人有脚本,可以为我做?

+0

不要你的意思整理? –

+0

你对!我改变了,谢谢 – Sasha

回答

0

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

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

列的实际排序会改变(重置列将是最后一列)。如果你的代码依赖于列的排序(它不应该!),你可以创建一个视图,该列将以正确的顺序排列(重命名表,创建与旧表相同名称的视图,从基表中撤销授予,添加赠款查看)。

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

希望这会有所帮助。

+0

你能否更新这个更详细的信息,例如一个实际的脚本,包括如何将数据从旧列转移到新列(如果有必要)? – David

1

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

ALTER DATABASE database_name COLLATE collation_name 
+0

(更改列归类)http://msdn.microsoft.com/en-us/library/ms190273。aspx –

+0

但我需要为每一列(很多工作)做,即时提问是否有某种脚本自动执行它 – Sasha

+0

如果有任何依赖关系(如列上的索引或全文搜索),那么这不会没有工作。 – David

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 

有一点要注意,但是,如果列约束的目标或生成的脚本将无法工作以模式绑定对象(视图或函数)为目标。

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

0

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

它是基于脚本:

ALTER TABLE TABLENAME ALTER COLUMN COLUMNNAME varchar(100) COLLATE Latin1_General_CI_AS NULL 
相关问题