изменение параметров сортировки базы данных SQL Server - PullRequest
3 голосов
/ 07 сентября 2010

Можно ли изменить параметры сортировки для всех объектов в базе данных?

Например, если я изменю параметры сортировки базы данных, он должен изменить все объекты (таблицы, процедуры и т. Д.), Связанные с этой базой данных.

1 Ответ

3 голосов
/ 07 сентября 2010

У меня была эта проблема некоторое время назад, когда мы изменили базовую базу данных для поддержки юникода и мне нужно было изменить наборы символов в устаревшей базе данных для поддержки венгерского.

Этот скрипт поможет вам изменить сортировку; вам нужно будет изменить основной порядок сортировки БД вручную. Мне не приходилось долго его запускать, пока он не исправляет вычисляемые столбцы, но могут быть и другие проблемы. Не запускайте его в действующей базе данных, не проверив его сначала - вы можете выбрать изменения, которые он вносит, чтобы вы могли провести аудит или выяснить, какие из них пропущены позже.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...