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


27

サーバー全体と特定のデータベースのSQL Server 2008 R2 Express Default Collat​​ionを変更するにはどうすればよいですか?

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


2
データベース内のすべての列の照合順序を変更する場合は、このスクリプトをご覧ください。私はそれを自分で試したことはありませんが、それをやろうとしている同僚のために見つけました。
ジャスティンディアリング

2
データベースの照合順序を変更する場合は、次のツールを確認してください。codeproject.com / KB / database / ChangeCollat​​ion.aspx SQL Server 2005および2008で動作します。ウェブ。
アーウィン

回答:


25

はい。

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

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

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

  • サーバ

  • データベース

  • カラム

  • 表現

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

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

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

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

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

  • setupコマンドのSQLCOLLATIONプロパティで新しい照合を指定して、masterデータベース再構築します

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

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

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

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

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

列照合の設定と変更

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

6

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


5

私はこのようなことをしましたが、うまくいきましたが、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 

これは私の混乱を投稿した私の最初の答えです


-1

すべてのデータ(ログイン、リンクサーバー、SQLエージェントジョブ、DBメール設定などを含む)をエクスポートし、インスタンスレベルのデータ再構築し、さらにすべてのユーザーデータを再ロードするのは、大変な作業です。そして、それでもALTER DATABASE、操作の完了を妨げる条件がいくつかあるため、データベースのデフォルトの照合を更新できる保証はありません(詳細については、ALTER DATABASEドキュメントの「データベース照合の変更」セクションを参照してください) 。

ただし、ドキュメント化されていない方法の方がはるかに簡単です。主な欠点は、サポートされていないことです。これは、何かがうまくいかないと言うことではなく、何か問題が発生しても、マイクロソフトは修正を支援しません(動作することを保証しなかったため)。

私が話す方法はsqlservr.exe-q {new_collation_name}スイッチで実行しています。それ以上のことがありますが、それは基本的な考え方です。このメソッドは、システムメタデータを更新するだけで、利点と結果があります。主なものは次のとおりです。

利点

  • かなり速い
  • ALTER DATABASE動作を妨げるほとんどの制限を回避する
  • オブジェクトをドロップして再作成するために長年にわたって考えてきたスクリプトよりもはるかに正確である可能性が高い

ドローバック

  • 何かがうまくいかない場合はサポートされません
  • VARCHARデータができるコードページは、古いものと新しい照合順序の間で異なっている、場合には、変更および 255(0x80と- -の0xFF)128の値を持つ文字が存在し、そしてそれらの文字は、新しいコードに同じ値で同じ文字として存在しません。ページ。そのため、データ損失の可能性があります。この状態が存在しないことを確認するには、まずデータを調査する必要があります。ただし、これは、コードページが変更された場合でも、0〜127の値を持つ文字のみが危険ではない場合が多くあることも意味します。
  • ユーザー定義のテーブルタイプ(UDTT)はスキップされ、手動で更新する必要があります。

sqlservr.exe -qメソッドが行うことと行わないことの詳細な説明(さまざまなレベルでの照合の動作の詳細、および注意すべき潜在的な問題を含む)については、私の投稿を参照してください。

インスタンス、データベース、およびすべてのユーザーデータベースのすべての列の照合順序を変更する:何が間違っている可能性がありますか?

(システム・データベースを含む:唯一のインスタンスを変更するにはmastermodelmsdb、およびtempdb)、および1つ以上のデータベース(ただし、すべてのデータベース)、単にあなたがこの操作から除外するというデータベースをデタッチし、それらを再取り付け照合の更新が完了すると。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.