ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

照合順序が異なる列の結合について

SQL Serverで照合順序が異なる列を結合する場合の注意点について、簡単にまとめておこうと思います。

サンプルデータ

まずは、本記事内で扱うサンプルデータをご紹介します。

検証のために照合順序の設定が異なる2つのデータベースを用意したいと思います。

1つは、照合順序が「Japanese_CI_AS」のSampleAデータベースです。

SampleAデータベース

もう1つは、照合順序が「Japanese_90_BIN2」のSampleBデータベースです。

SampleBデータベース

照合順序は列レベルでも定義することができますが、デフォルトはデータベースの照合順序となります。そのため、SampleAデータベースで作成するテーブルの列の照合順序は「Japanese_CI_AS」になり、SampleBデータベースで作成するテーブルの列の照合順序は「Japanese_90_BIN2」となります。

上記の前提の元、以下のテーブルとデータを用意します。

-- SampleAデータベースで作成
CREATE TABLE [dbo].[Table_1] (
	[ID] [varchar](50) NULL,
	[Name] [varchar](50) NULL
);
INSERT INTO [dbo].[Table_1] ([ID] ,[Name]) VALUES ('1', '一郎'), ('2', '二郎'), ('3', '三郎');

-- SampleBデータベースで作成
CREATE TABLE [dbo].[Table_1] (
	[ID] [varchar](50) NULL,
	[Age] [varchar](50) NULL
);
INSERT INTO [dbo].[Table_1] ([ID] ,[Age]) VALUES ('1', '35'), ('2', '25'), ('3', '10');

上記の照合順序が異なるテーブル同士を結合してみて、挙動を確認したいと思います。

照合順序が異なる列の結合を試してみる

SampleAデータベースのTable_1テーブルと、SampleBデータベースのTable_1テーブルをID列で結合してそれぞれのデータを取得してみたいと思います。

SELECT
  *
FROM
  [SampleA].[dbo].[Table_1] t1
  INNER JOIN [SampleB].[dbo].[Table_1] t2
    ON t1.ID = t2.ID
;

実行すると以下の通り、エラーとなってしまいました。このように、照合順序が異なる列を結合した場合はエラーになります。

照合順序が異なる列の結合はエラーになる

照合順序が異なる列を結合した場合のエラーを回避する方法

照合順序が異なる列を結合した場合は、エラーになることがわかりました。

データベースを再作成して、照合順序を合わせるという方法もありますが、それができない場合もあると思います。そういったケースでエラーを回避する方法があります。

実は、COLLATEを使用することでエラーを回避できます。以下のように、結合するキーのところに記述できます。

SELECT
  *
FROM
  [SampleA].[dbo].[Table_1] t1
  INNER JOIN [SampleB].[dbo].[Table_1] t2
    ON t1.ID = t2.ID COLLATE Japanese_CI_AS
;

実行結果は以下のとおりです。エラーにならずにデータを想定通り取得することができました。

照合順序が異なる列を結合する場合は、COLLATE句を使用する

COLLATEは、照合順序を指定のものに変換することができる句です。結合するカラムが少ない場合は、上記のようにピンポイントで照合順序を指定することでエラーを回避することができます。

おわりに

いかがでしたでしょうか。

同じデータベース内で照合順序が異なることの可能性は低いと思いますが、今回の記事のようにデータベースが異なると照合順序が異なる場合も十分にあると思います。頭の片隅にでも覚えておきたいですね。

今回はこの辺で。最後までお読みいただきありがとうございました。