SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Azure のデータベースの照合順序の指定と一時テーブルへの影響

leave a comment

SQL Azure のバージョンアップにより、ユーザーデータベース作成時に任意の照合順序が指定できるようになりました。
CREATE DATABASE (SQL Azure Database)

オンプレミスの SQL Server の場合はユーザーデータベースであれば、ALTER DATABASE で COLLATE 句を使用することで作成後も変更することが可能です。
データベース照合順序の設定および変更

SQL Azure の場合は ALTER DATABASE の COLLATE 句はサポートされていないため、照合順序の設定ができるのはデータベースの作成時のみとなるようです。
ALTER DATABASE (SQL Azure Database)

SQL Azure のデータベースの照合順序ですが、一時テーブルにも影響を与えそうです。
今回はこの点についてまとめてみたいと思います。

■データベースの照合順序と一時テーブルの照合順序


現在は、Azure のポータルから DB を新規に作成する場合には照合順序を選択することはできないようです。
image

SQL Azure のポータルから DB を新規に作成する際には、照合順序が選択できます。
image

デフォルトでは、[SQL_Latin1_General_CP1_CI_AS] が設定されている状態となっています。

今回は、[Japanese_XJIS_BIN2] に設定してみます。
image

作成が終わったら、作成した DB に接続して、[sys.databases] から照合順序を確認してみます。
image

master はデフォルトの [SQL_Latin1_General_CP1_CI_AS] が照合順序として設定されていますが、作成したユーザーデータベースは設定したものになっているのが確認できますね。

この照合順序ですが、一時テーブルに関しても影響するようです。
通常、一時テーブルは tempdb 上に作成され、照合順序も tempdb のものが使用されます。

  • tempdb の照合順序が [Japanese_XJIS_100_CI_AS_SC] (大文字小文字を区別しない / アクセントを区別する / 補助文字)
  • ユーザーデータベースの照合順序が [Japanese_XJIS_BIN2]

となっている環境で以下のクエリを実行してみます。

CREATE TABLE #tmp(Col1 nvarchar(1))
INSERT INTO #tmp VALUES (N’a’)
SELECT * FROM #tmp WHERE Col1 = N’A’
DROP TABLE #tmp

image

ユーザーデータベース自体はバイナリ照合順序のため、大文字 / 小文字が区別されますが、tempdb は大文字 / 小文字を区別しない照合順序となっているため、小文字の [a] で挿入したデータを 大文字の [A] で検索しても条件にヒットする形となります。
# tempdb の照合順序が使用されているため。

それでは、SQL Azure に対して同じクエリを実行してみます。

SQL Azure では検索結果が取得されていません。
image

システムデータベースである master は [SQL_Latin1_General_CP1_CI_AS] (大文字小文字を区別しない / アクセントを区別する) となっているため、一時テーブルでもこの照合順序が使用されると思ったのですがそうではなくユーザーデータベースの照合順序が一時テーブルでも使われるようです。

SQL Server 2012 でもコンテインメント (Contained Databases : 包含データベース) を使用することで、一時テーブルの照合順序をユーザーデータベースのものを使用するということが可能なのですが、これと同等の実装となっているようですね。
# SQL Server 2012 の包含データベースは SQL Azure からのフィードバックかな~と個人的に思ったりしています。

SQL Server 2012 で包含データベースを使って開発していれば、この辺は意識しなくても大丈夫かもしれませんが、SQL Server 2008 R2 では包含データベースの機能はありませんので、tempdb の照合順序はインストール時に指定したものが使用されることになりますので、一時テーブルを使用した開発をする際には少し注意する必要がありそうですね。

Share

Written by Masayuki.Ozawa

12月 13th, 2011 at 8:31 pm

Posted in SQL Azure

Tagged with

Leave a Reply