web-dev-qa-db-ja.com

SQL Serverの照合順序を変更する方法

サーバー全体と特定のデータベースのSQL Server 2008 R2 Expressの既定の照合順序を変更するにはどうすればよいですか?

SQL Server Management Studioのビジュアルインターフェイスを使用してそれを行う方法はありますか? [サーバープロパティ]ウィンドウ(および対応する[データベースプロパティ]ウィンドウ)では、このプロパティは編集できません。

27
rem

はい。

SQL Server 2008 R2 Expressインスタンスと個々のデータベースのデフォルトの照合順序を変更できますが、これは複雑なタスクです。

悲しいことに、SSMSを介してそれを行う視覚的なオプションはありません。

SQL Server 2008は、次のレベルでの照合順序の設定をサポートしています:

  • サーバ

  • データベース

  • カラム

  • 表情

デフォルトのインストール設定は、Windowsシステムロケールによって決まります。サーバーレベルの照合順序は、セットアップ中に変更するか、インストール前にWindowsシステムロケールを変更することで変更できます。 もっと...

サーバー照合の設定と変更-SQL Server 2008

  • ユーザーデータベースとその中のすべてのオブジェクトを再作成するために必要なすべての情報またはスクリプトがあることを確認してください。

  • Bcpユーティリティなどのツールを使用して、すべてのデータをエクスポートします。詳細については、バルクデータのインポートとエクスポートを参照してください。

  • すべてのユーザーデータベースを削除します。

  • マスターデータベースを再構築する セットアップコマンドのSQLCOLLATIONプロパティで新しい照合順序を指定する

  • すべてのデータベースとその中のすべてのオブジェクトを作成します。

  • すべてのデータをインポートします。

データベース照合の設定と変更-SQL Server 2008

  • 新しいデータベースを作成するときに、CREATE DATABASEステートメントでCOLLATIONオプションを設定します。
  • 同様に、ALTER DATABASEステートメントでCOLLATIONオプションを設定して、既存のデータベースの照合を変更します。

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

列の照合順序の設定と変更

  • データベースの照合順序を変更した後でも、一部の列の照合順序は同じままです。その場合、個々の列の照合順序を変更する必要があります。
25
CoderHawk

上記の回答で述べたように、本当にユーザーデータベースを「削除」することを確認してください。データベースを「デタッチ」したいだけかもしれません。あるいは、マスターを再構築するとユーザーデータベースへのリンクが効果的に削除されるため、実際には何もできません。データベースが目的の照合順序で作成されてもサーバーが作成されない場合があります。この場合、バックアップからすべてのユーザーデータベースを回復する必要はありません。

6
AndrewSQL

私はこのようなことをしましたが、それはうまくいきましたが、text/varchar/nvarcharを削除する必要があるので、データ型を指すインデックスを削除し、スクリプトを実行してからインデックスを作成する必要があることに注意してください。

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 

これは私の最初の回答です。

5
Jeffry