サーバー全体と特定のデータベースのSQL Server 2008 R2 Expressの既定の照合順序を変更するにはどうすればよいですか?
SQL Server Management Studioのビジュアルインターフェイスを使用してそれを行う方法はありますか? [サーバープロパティ]ウィンドウ(および対応する[データベースプロパティ]ウィンドウ)では、このプロパティは編集できません。
はい。
SQL Server 2008 R2 Expressインスタンスと個々のデータベースのデフォルトの照合順序を変更できますが、これは複雑なタスクです。
悲しいことに、SSMSを介してそれを行う視覚的なオプションはありません。
SQL Server 2008は、次のレベルでの照合順序の設定をサポートしています:
サーバ
データベース
カラム
表情
デフォルトのインストール設定は、Windowsシステムロケールによって決まります。サーバーレベルの照合順序は、セットアップ中に変更するか、インストール前にWindowsシステムロケールを変更することで変更できます。 もっと...
ユーザーデータベースとその中のすべてのオブジェクトを再作成するために必要なすべての情報またはスクリプトがあることを確認してください。
Bcpユーティリティなどのツールを使用して、すべてのデータをエクスポートします。詳細については、バルクデータのインポートとエクスポートを参照してください。
すべてのユーザーデータベースを削除します。
マスターデータベースを再構築する セットアップコマンドのSQLCOLLATIONプロパティで新しい照合順序を指定する
すべてのデータベースとその中のすべてのオブジェクトを作成します。
すべてのデータをインポートします。
データベース照合の設定と変更-SQL Server 2008
CREATE DATABASE
ステートメントでCOLLATION
オプションを設定します。同様に、ALTER DATABASE
ステートメントでCOLLATION
オプションを設定して、既存のデータベースの照合を変更します。
ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;
上記の回答で述べたように、本当にユーザーデータベースを「削除」することを確認してください。データベースを「デタッチ」したいだけかもしれません。あるいは、マスターを再構築するとユーザーデータベースへのリンクが効果的に削除されるため、実際には何もできません。データベースが目的の照合順序で作成されてもサーバーが作成されない場合があります。この場合、バックアップからすべてのユーザーデータベースを回復する必要はありません。
私はこのようなことをしましたが、それはうまくいきましたが、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
これは私の最初の回答です。