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:

Adsız dedi ki...

"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

Mehmet GÜZEL dedi ki...

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

Adsız dedi ki...

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 :)

Tolga dedi ki...

teşekkür

black_oz dedi ki...

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:

.::YASAL UYARI::.

©2004-2016 Mehmet GÜZEL, http://www.mehmetguzel.net/ & http://www.mehmetguzel.com/

Site içeriği kaynak gösterilmek koşuluyla yayınlanabilir. Yazılan yazı ve yorumlar sadece yazı ve yorum sahiplerini bağlar.