更改SQL Server数据库排序规则

4

是否可以更改数据库下所有对象的排序规则?

例如,如果我更改了数据库的排序规则,它应该更改与该数据库相关的所有对象(表、存储过程等)。


可能是更改SQL Server数据库排序的重复问题。 - gbn
1个回答

4

我曾经遇到这个问题,当时我们更改了底层数据库以支持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

嗨,我正在尝试您的脚本,但索引阻止我更改列排序规则(说对象依赖于该列)。您知道有什么解决方法吗?谢谢! - Pablo Venturino
1
很抱歉,您需要将它们全部删除。您可以使用管理工具对其进行脚本处理,然后再重新添加回去。 - u07ch

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