更改 SQL Server 数据库排序规则
Posted
技术标签:
【中文标题】更改 SQL Server 数据库排序规则【英文标题】:changing SQL Server database collation 【发布时间】:2011-04-08 23:47:38 【问题描述】:是否可以更改数据库下所有对象的排序规则?
例如,如果我更改数据库排序规则,它应该更改与该数据库相关的所有对象(表、过程等)。
【问题讨论】:
Changing SQL Server Database sorting 的可能重复项 【参考方案1】:不久前,当我们更改底层数据库以支持 unicode 并且需要更改旧数据库上的字符集以支持匈牙利语时,我遇到了这个问题。
这个脚本会让你改变排序规则;您将需要手动更改主数据库排序规则。我很长一段时间都没有运行它,它没有修复任何计算列,但可能还有其他问题。不要在未先测试的情况下在实时数据库中运行它 - 您可能需要选择它所做的更改,以便稍后审核或找出遗漏的更改。
Declare
@NewCollation varchar(255), @DBName sysname
Select @NewCollation = 'Latin_1_CI_AI', -- change this to the collation that you need
@DBName = DB_NAME()
Declare
@CName varchar(255), @TbleName sysname, @objOwner sysname, @Sql varchar(8000), @Size int, @Status tinyint, @Colorder int
Declare CurWhileLoop cursor read_only forward_only local
for Select
QUOTENAME(C.Name)
,T.Name
,QUOTENAME(U.Name) + '.' +QUOTENAME(O.Name)
,C.Prec
,C.isnullable
,C.colorder
From syscolumns C
inner join systypes T on C.xtype=T.xtype
inner join sysobjects O on C.ID=O.ID
inner join sysusers u on O.uid = u.uid
where T.Name in ('varchar', 'char', 'text', 'nchar', 'nvarchar', 'ntext')
and O.xtype in ('U')
and C.collation != @NewCollation
and objectProperty(O.ID, 'ismsshipped')=0
order by 3, 1
open CurWhileLoop
SET XACT_ABORT ON
begin tran
fetch CurWhileLoop into @CName, @TbleName, @objOwner, @Size, @Status, @Colorder
while @@FETCH_STATUS =0
begin
set @Sql='ALTER TABLE '+@objOwner+' ALTER COLUMN '+@CName+' '+@TbleName+ isnull ('('
+convert(varchar,@Size)+')', '') +' COLLATE '+ @NewCollation
+' '+case when @Status=1 then 'NULL' else 'NOT NULL' end
exec(@Sql) -- change this to print if you need only the script, not the action
fetch CurWhileLoop into @CName, @TbleName, @objOwner, @Size, @Status, @Colorder
end
close CurWhileLoop
deallocate CurWhileLoop
commit tran
【讨论】:
嗨,我正在尝试您的脚本,但索引阻止我更改列排序规则(说对象取决于列)。您知道解决方法吗?谢谢! 恐怕你将不得不把它们全部扔掉。您可以使用 management studio 编写脚本,然后再将它们放回去。以上是关于更改 SQL Server 数据库排序规则的主要内容,如果未能解决你的问题,请参考以下文章