我需要重置数据库中所有表的所有列的排序规则:
我想使用数据库的默认排序规则。
我尝试在数据库属性下更改它:
但是,由于列已经设置了排序规则,这意味着我无法覆盖它。
有没有脚本可以帮我完成这个操作?
![enter image description here](https://istack.dev59.com/06Z5D.webp)
我尝试在数据库属性下更改它:
![enter image description here](https://istack.dev59.com/dKcDg.webp)
有没有脚本可以帮我完成这个操作?
我已经编写了一个脚本,应该可以做得相当不错(希望如此)。在适当的数据库中以文本方式运行脚本。然后将输出内容复制并粘贴到一个脚本窗口中,以更改每个列的排序规则:
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
需要注意的一点是,如果列是约束的目标或被模式绑定对象(视图或函数)所针对,则生成的脚本将无法起作用。
在这种情况下,您需要编写依赖对象的脚本,从数据库中删除它们,然后运行上面生成的脚本,最后重新添加依赖对象。
请参阅(更改数据库排序规则)http://msdn.microsoft.com/en-us/library/ms174269.aspx
ALTER DATABASE database_name COLLATE collation_name
一个提议的脚本(可以在这里找到)旨在遍历您的数据库中的所有表并将校对更改为所需的校对。
它基于脚本:
ALTER TABLE TABLENAME ALTER COLUMN COLUMNNAME varchar(100) COLLATE Latin1_General_CI_AS NULL
重置列的最快方法是将该列设置为未使用,然后添加一个具有相同名称和数据类型的列。
由于这两个操作都不会触及实际表(只会更新字典),因此这将是最快的方法。
实际列的顺序将被更改(重置列将成为最后一列)。如果您的代码依赖于列的顺序(不应该!),您可以创建一个视图,使列按正确的顺序排列(重命名表,创建与旧表同名的视图,撤销基表的授权,添加视图的授权)。
SET UNUSED方法不会回收列所用的空间(而删除列将在每个块中释放空间)。
希望这能帮到您。