2007-09-07

Collation Adını Değiştirme

Change Collation Name

SQL Server'da Collation adını değiştirme bir çok kişinin ihtiyaç duyduğu bir değişiklik. Çoğu zaman çoğu kişi bu işi yapmak için yeniden veritabanı oluşturur. Aşağıdaki SQL kodu ile bunu rahatlıkla halladebilirsiniz.

Syntax : ALTER DATABASE VeritabanıAdı COLLATE CollationAdi

Örnek: ALTER DATABASE MEHMET COLLATE Turkish_CI_AS

5 yorum:

  1. "The database could not be exclusively locked to perform the operation." hatası almamak için daha dolu bir çözüm...

    ALTER DATABASE VeritabaniAdi SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    ALTER DATABASE VeritabaniAdi COLLATE CollationAdi
    ALTER DATABASE VeritabaniAdi SET MULTI_USER

    mert

    YanıtlaSil
  2. Paylaşım için teşekkür Mert.

    YanıtlaSil
  3. COLLATE I DEISTIRMEK TABLOLARIN ICINDEKI COLOUMN BAZINDAKI COLLATELERI DEGISTIRMEZ GERCEK BIR DEGISIM YAPMAK ISTIYORSANIZ
    TUM TABLOLARIN CONSTRAINLERI DROP ET
    DATABASE I ALTER ET
    TABLOLARIN COLLATELI OLANLARI ALTER ET
    CONSTRAINTLERI GERI YUKLE

    OHH NE GUZEL IS BU ISI YAPANA HELAL OLSUN :)

    YanıtlaSil
  4. Tobloların hepsini drop etmenize gerek yok aşağıdaki kodu kullanarak default collate olmayanlaı değiştirebilmeniz için hazır kod üretir.

    Kolay gelsin.

    -------------------------------------------------------------
    --- LM_ChangeCollation - Change collation in all tables
    --- made by Luis Monteiro - ljmonteiro@eurociber.pt
    --- modified by wilfred van dijk - wvand@wilfredvandijk.nl
    -------------------------------------------------------------
    DECLARE @new_collation varchar(100)
    DECLARE @debug bit
    DECLARE
    @table sysname,
    @previous sysname,
    @column varchar(60),
    @type varchar(20),
    @legth varchar(4),
    @nullable varchar(8),
    @sql varchar(8000),
    @msg varchar(8000),
    @servercollation varchar(120)
    /*

    uncomment one of the following lines:
    */
    set @new_collation = convert(sysname, databasepropertyex(DB_NAME(), 'collation'))
    --- set @new_collation = convert(sysname, serverproperty('collation'))
    /*

    @debug = 0 to execute
    */
    set @debug = 1
    if @new_collation is null

    begin

    print 'which collation?'

    goto einde

    end
    DECLARE C1 CURSOR FOR

    select 'Table' = b.name,

    'Column' = a.name,

    'Type' = type_name(a.system_type_id),

    'Length' = a.max_length,

    'Nullable' = case when a.is_nullable = 0 then 'NOT NULL' else ' ' end

    from sys.columns a

    join sysobjects b

    on a.object_id = b.id

    where b.xtype = 'U'

    and b.name not like 'dt%'

    and type_name(a.system_type_id) in ('char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext')

    and a.[collation_name] <> @new_collation

    order by b.name,a.column_id
    OPEN C1
    FETCH NEXT
    FROM C1
    INTO @table,@column,@type,@legth,@nullable
    set @previous = @table
    WHILE @@FETCH_STATUS = 0
    BEGIN

    if @table <> @previous print ''

    set @sql = 'ALTER TABLE ' + QUOTENAME(@table) + ' ALTER COLUMN ' + QUOTENAME(@column) + ' '

    set @sql = @sql + @type + '(' + @legth + ')' + ' COLLATE ' + @new_collation + ' ' + @nullable

    print @SQL

    if @debug = 0

    begin

    begin try

    EXEC (@sql)

    end try

    begin catch

    print 'ERROR:' + ERROR_MESSAGE()

    print ''

    end catch

    end

    set @previous = @table

    FETCH NEXT

    FROM C1

    INTO @table,@column,@type,@legth,@nullable

    END
    CLOSE C1
    DEALLOCATE C1
    einde:

    YanıtlaSil

Lütfen yorumlarınızda Ad Soyad ve Web sayfanızın adresini girelim!