SQL Serverでは文字列比較の基準となる照合順序が設定できる。
例えば「大文字小文字を区別する」等である。
これはデータベース毎に設定可能で、特に指定していない場合はSQL Serverセットアップ時に設定したサーバーデフォルト値が適用される。
デフォルトと異なる照合順序をデータベースに設定した場合、トラブルが発生しやすい。
例えば、一時テーブルと作成し、それとデータベース内のテーブルをJOINするようなクエリはエラーになる。
これは、一時テーブルの照合順序はサーバーのデフォルト値になっており、
異なる照合順序でのon Table.col1=temptable.col1
という比較が行えないためである。
(on Table.col1=temptable.col1 collate Japanese_CI_AS
のように、クエリの中で照合順序を指定すればエラーは発生しない。)
仕事の都合で照合順序の変更を余儀なくされたことがあったので、その手順をメモする。
なお、実際に行ったのはSQL Server 2012だが、2008 R2や2014でも同じだと思う。
・データベース単体の照合順序変更方法
以下のクエリを実行すれば良い。
対象のデータベース名をSampleDataBase
、照合順序をJapanese_CI_AS_KS_WS
とする。
1 |
ALTER DATABASE SampleDataBase COLLATE Japanese_CI_AS_KS_WS |
・SQL Server(=システムデータベース)の照合順序変更方法
データベースが存在すると実行できないため、システムデータベースを除く全てのデータベースを削除する。
(復元が必要な場合はバックアップをとっておく。)
SQLのインストールディレクトリ内にSetup.exe
があるので、そこに移動する。
規定ではC:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\Release
である。
コマンドプロンプトからSetup.exeを以下のコマンドで実行する。
1 |
Setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName] |
例えば、インスタンス名は規定のMSSQLSERVER
、Windows認証でAdministratorがSQL Serverにログイン可能で、
照合順序をJapanese_CI_AS_KS_WS
に変更したい場合は以下のようなコマンドを実行する。
1 |
Setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=Administrator /SQLCOLLATION=Japanese_CI_AS_KS_WS |
なお、実行できない場合、インストールメディアのSetup.exeで試すとうまくいく場合がある。
理由は不明で、偶然かもしれないが、そういう場合もあった。