我需要重置数据库中所有表中所有列的排序规则:
我想使用数据库的默认排序规则
我尝试在数据库属性下更改它:
但是已经在列中设置了排序规则,这意味着我无法覆盖它
任何人都有可以为我做的脚本吗?
答案 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