Veritabanı ve mevcut tablolarının, kolonlarının collation’ınını değiştirmek
Bazı durumlarda veritabanı collation değişikliği gerekebilir. Birçok kişi veritabanı seviyesinde collation’ı değiştirmenin durumu düzelteceğini düşünür. Fakat veritabanı bazında collation’ı değiştirdiğinizde mevcut tablolardaki kolonların collation’ı değişmez. Bu makalede bu sorunu nasıl çözeceğimizi bulabilirsiniz.
Öncelikle verinizin güvenliği için backup almayı ihmal etmeyin.
Aşağıdaki kod yardımıyla veritabanı bazında collation’ ı değiştirebilirsiniz.
USE master GO SELECT DATABASEPROPERTYEX('test','COLLATION') GO ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO USE test GO ALTER DATABASE test COLLATE Turkish_CI_AI GO SELECT DATABASEPROPERTYEX('test','COLLATION') GO ALTER DATABASE test SET MULTI_USER
Fakat veritabanı collation değişikliği mevcut tablolar ve kolonlar için geçerli değildir. Eğer mevcut tablolar ve tüm kolonlar için de aynı değişikliği yapmak isterseniz yukarıdaki script’i çalıştırdıktan sonra aşağıdaki script’i çalıştırmalısınız.
declare @NewCollation sysname set @NewCollation = 'Turkish_CI_AS' select 'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(stable.schema_id)) + '.' + QUOTENAME(stable.name) + ' ALTER COLUMN ' + QUOTENAME(scol.name) + ' ' + stype.name + '(' + CASE WHEN scol.max_length = -1 THEN 'max' ELSE CONVERT(varchar(10),scol.max_length) END + ') collate ' + @NewCollation + ' go ' from sys.columns scol inner join sys.tables stable on scol.object_id = stable.object_id inner join sys.types stype on scol.user_type_id = stype.user_type_id where scol.collation_name is not null and OBJECTPROPERTY(stable.object_id,N'IsMSShipped')=0