SQL Serverデータベースの照合順序を変更するにはどうすればよいですか?


16

すべてのデータベースを単一の照合-Latin1_General_CI_AS(標準照合)で標準化しようとしています。SQL_Latin1_General_CP1_CI_ASにあるデータベースがいくつかあります。

ALTER DATABASEを使用してデータベースの照合順序を変更できることは知っていますが、それは新しいオブジェクトにのみ影響します。私の理解では、既存の列を変更する唯一の方法は、すべてのテーブルの各列でALTER COLUMNを実行することです-それを行うには、すべてのインデックスを削除して再作成する必要があります。

私はそれがこのようなものになると思います:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

データベース全体のすべてのvarchar、char、text、nvarchar、nchar、およびntext列に対して繰り返します。これは膨大な SQLスクリプトになります。

これを行う簡単な方法はありますか、それを行うSQLスクリプトの作成を自動化する方法を誰かが提案できますか?

回答:


9

MS KB 325335には、db全体とすべての列に対してこれを行う方法に関するオプションがあります。

基本的に:

  1. スクリプトデータベーステーブル(新しい照合あり)
  2. DTS / SSISデータ(照合の監視)
  3. 制約を追加する


2

残念ながら、これはSQL Serverの簡単なタスクではありません。

既存のデータベースオブジェクト(テーブル、ストアドプロシージャ、ビューなど)にRedgateのSQL Compareのようなスクリプトツールを使用できます。ライセンスがない場合は、無料トライアルを使用できます。適切な照合で新しいデータベースを作成し、スクリプトからオブジェクトを再構築したら、SSISを実行して、データベース間でデータを転送できます。大量のデータがある場合は、T-SQL一括挿入を使用します。

そのサーバー上の将来のデータベースに対して正しい照合を行うために、サーバー上のデフォルトの照合を変更できます。次のMSDN記事では、ALTER DATABASEおよびALTER TABLEのCOLLATE句を使用してどのような変更が行われるかについて説明しています。

データベース照合の設定と変更(SQL Server 2008オンラインブック)

ALTER DATABASEステートメントのCOLLATE句を使用して、ユーザーデータベースに作成された新しいオブジェクトの照合順序を変更できます。このステートメントは、既存のユーザー定義テーブルの列の照合順序を変更しません。これらは、ALTER TABLEの COLLATE句を使用して変更できます。

データベースの照合順序を変更すると、次のものが変更されます。

  • データベースのデフォルトの照合。この新しいデフォルトの照合は、その後データベースに作成されるすべての列、ユーザー定義のデータ型、変数、およびパラメーターに適用されます。また、SQLステートメントで指定されたオブジェクト識別子をデータベースで定義されたオブジェクトに対して解決するときにも使用されます。
  • システムテーブル内のchar、varchar、text、nchar、nvarchar、またはntext列はすべて、新しい照合に変更されます。
  • 既存のすべてのchar、varchar、text、nchar、nvarchar、またはntextパラメーターと、ストアドプロシージャおよびユーザー定義関数のスカラー戻り値は、新しい照合に変更されます。
  • char、varchar、text、nchar、nvarchar、またはntextシステムデータ型、およびこれらのシステムデータ型に基づくすべてのユーザー定義データ型は、新しいデフォルトの照合に変更されます。

1

一般に、ライブサーバーに対してこれを行うことは推奨されません。前回見たとき、これを行うことはMicrosoftによって公式にサポートされていませんでした。これを実際に行うには、正しい照合順序で新しいインスタンスを作成し、データベースをそれに移行する必要があります。

tempdbには新しいサーバーの照合があるため、デフォルトの照合が異なるサーバーへのDBの復元では、あらゆる種類の楽しみが生じます。これもお勧めしません。



1

Infomation_Schemaビューを使用してスクリプトを簡単に生成できますが、これが問題を解決する最善の方法であるかどうかはわかりません。大きなデータベースですべてのインデックスを再作成すると、膨大な時間/ログスペースなどがかかる可能性があります。新しいインスタンスへの移行(復元ではなく)を行います。

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