SQL Server harmanlaması nasıl değiştirilir


27

Tüm sunucu ve belirli bir veritabanı için SQL Server 2008 R2 Express Varsayılan Harmanlamasını nasıl değiştirebilirim?

SQL Server Management Studio'nun görsel arabirimini kullanarak yapmanın bir yolu var mı? Sunucu Özellikleri penceresinde (ve karşılık gelen Veritabanı Özellikleri penceresinde), bu özellik düzenleme için kullanılamaz.


2
Veritabanındaki tüm sütunların harmanlamasını değiştirmek istiyorsanız bu komut dosyasına bakın . Kendim denemedim, ama tam da bunu yapmak isteyen bir iş arkadaşı için buldum.
Justin Dearing

2
Bir veritabanının harmanlamasını değiştirmek istiyorsanız, şu aracı inceleyin: codeproject.com/KB/database/ChangeCollation.aspx SQL Server 2005 ve 2008 ile çalışır ve benim için bulabileceğiniz komut dosyalarından daha iyi çalıştı. ağ.
Erwin

Yanıtlar:


25

Evet.

SQL Server 2008 R2 express örneği ve tek tek veritabanlarının varsayılan harmanlamasını değiştirebilirsiniz, ancak bu karmaşık bir iştir.

Ne yazık ki, SSMS ile yapmak için görsel bir seçenek yoktur.

SQL Server 2008, harmanlamaları aşağıdaki düzeylerde ayarlamayı destekler:

  • Sunucu

  • Veritabanı

  • sütun

  • ifade

Varsayılan yükleme ayarları, Windows sistem yerel ayarlarına göre belirlenir. Sunucu düzeyinde harmanlama, kurulum sırasında veya kurulumdan önce Windows sistem yerel ayarını değiştirerek değiştirilebilir. Daha...

Sunucu Harmanlamasını Ayarlama ve Değiştirme - SQL Server 2008

  • Kullanıcı veritabanlarınızı ve içindeki tüm nesneleri yeniden oluşturmak için gereken tüm bilgilere veya komut dosyalarına sahip olduğunuzdan emin olun.

  • Tüm verilerinizi bcp Utility gibi bir araç kullanarak dışa aktarın. Daha fazla bilgi için, bkz. Toplu Verileri Alma ve Verme.

  • Tüm kullanıcı veritabanlarını bırakın.

  • Setup komutunun SQLCOLLATION özelliğinde yeni harmanlamayı belirten ana veritabanını yeniden oluşturun

  • Tüm veritabanlarını ve içindeki tüm nesneleri oluşturun.

  • Tüm verilerinizi içe aktarın.

Veritabanı Harmanlamasını Ayarlama ve Değiştirme - SQL Server 2008

  • Yeni bir veritabanı oluştururken ifadedeki COLLATIONseçeneği ayarlayın CREATE DATABASE.
  • Benzer şekilde, mevcut bir veritabanının harmanlamasını değiştirmek için ifadedeki COLLATIONseçenekleri ayarlayın ALTER DATABASE.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Sütun Harmanlamasını Ayarlama ve Değiştirme

  • Bazı sütun harmanlamaları, veritabanı harmanlamasını değiştirdikten sonra bile aynı kalır. Bu durumda, tek tek sütunların harmanlamasını değiştirmeniz gerekir.

6

Yukarıdaki cevapta belirtildiği gibi kullanıcı veritabanlarını gerçekten "bırakmak" istediğinizden emin olun. Sadece veritabanlarını "ayırmak" isteyebilirsiniz. Ya da gerçekten, ustayı yeniden kurmak, kullanıcı veritabanlarına olan bağlantıları etkin bir şekilde silerken hiçbir şey yapamazsınız. Veritabanlarının istenen harmanlamada oluşturulduğu zamanlar vardır, ancak sunucu değildir. Bu durumda tüm kullanıcı veritabanlarınızı yedekten geri almak istemeyeceksiniz.


5

Bunun gibi bir şey yaptım ve işe yaradı, ancak text / varchar / nvarchar olarak veri tipini gösteren dizinlerin düşürülmesi, betiği çalıştırıp dizinleri oluşturması gerektiğini aklınızda bulundurmanız gerekir.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

bu benim ilk cevabım gönderildi afedersin karışıklık


-1

Tüm verileri dışa aktarma (girişler, bağlantılı sunucular, SQL Agent işleri, DB Mail ayarları, vb. Dahil) ve örnek düzeyindeki verileri yeniden oluşturmak, ayrıca tüm kullanıcı verilerini yeniden yüklemek çok fazla iş gerektirir. Tüm bunlardan sonra bile, bir veritabanının varsayılan harmanlamasını ALTER DATABASE, işlemin tamamlanmasını engelleyecek birkaç koşul olduğundan , güncelleme yapabileceğinizin bir garantisi yoktur (lütfen ayrıntılar için ALTER DATABASEbelgelerin "Veritabanı Harmanlamasını Değiştirme" bölümüne bakın) .

Ancak, çok daha kolay olan belgelenmemiş bir yöntem var . En büyük dezavantajı desteklenmemesi. Bu, bir şeyin ters gideceğini söylemek değildir, yalnızca bir şey olursa, Microsoft'un düzeltmeye yardımcı olmayacağı (çünkü bunun işe yarayacağını asla garanti etmedikleri) söylenir.

Ben söz yöntem çalıştığı sqlservr.exeile -q {new_collation_name}anahtar. Bundan biraz daha fazlası var, ama temel fikir bu. Bu yöntem, temel olarak, faydaları ve sonuçları olan sistem meta verilerini günceller:

FAYDALARI

  • oldukça hızlı
  • ALTER DATABASEçalışmasını engelleyen çoğu kısıtlamayı atlayın
  • Nesneleri düşürmek ve yeniden yaratmak için insanların yıllar içinde bulabildikleri herhangi bir komut dosyasından çok daha hassas

KUSURLARI

  • bir şeyler ters giderse desteklenmez
  • VARCHARveri olabilir kod sayfası eski ve yeni alfabe arasındaki farklı, IF, değiştirmek ve 255 (0x80 - - 0xFF) 128 değerlerle karakterler var, ve bu karakterlerin yeni kod aynı değere sahip aynı karakter olarak var olmayan sayfa. Bu yüzden potansiyel veri kaybı için var ve bu durumun mevcut olmadığından emin olmak için önce verilerinizin araştırılması gerekiyor. Ancak, bu , kod sayfası değişse bile, sadece 0 - 127 değerleri olan, herhangi bir tehlike altında olmayan karakterleri olan birçok durum olduğu anlamına gelir .
  • Kullanıcı Tanımlı Tablo Tipleri (UDTT'ler) atlanır ve manuel olarak güncellenmeleri gerekir.

sqlservr.exe -qYöntemin ne yaptığı ve ne yapmadığına dair ayrıntılı bir açıklama için (harmanlamaların çeşitli düzeylerde nasıl çalıştığı ve dikkat edilmesi gereken konular hakkında ayrıntılı bilgi dahil), lütfen yazıma bakın:

Örneğin Harmanlamasının, Veritabanlarının ve Tüm Kullanıcı Veritabanlarındaki Tüm Sütunların Değiştirilmesi: Ne Yanlış Yanlış Olabilir?

(Sistem veritabanları dahil: Sadece örneğini değiştirmek için master, model, msdb, ve tempdb) ve bir veya birden fazla veri tabanları (ama hepsi veritabanları), basitçe bu operasyonun dışında tutmak istediğiniz veritabanı (ler) ayırmak ve sonra bunları yeniden takmak harmanlama güncellemesi tamamlandıktan sonra.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.