normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azure模試を復習 〜SQL Azureで発行するT-SQLのTIPS〜

先日、 id:haru-tama さんに「SQL Azureで今回取り扱うようなT-SQLを実行したらどうなるか」というお題を頂いた。私はあえなく撃沈してしまったわけだが、ご存じない方も多いと思うのでTIPSを記述させて頂く。

日本語関連

さて、まず以下のSQLを見て頂きたい。

CREATE TABLE 明細(
	主キー int PRIMARY KEY,
	文字1 nvarchar(200) NULL,
	文字2 varchar(200) NULL
)

INSERT INTO 明細(主キー, 文字1, 文字2) VALUES (1,N'はるたまさんの意地悪!', N'エロゲ')
INSERT INTO 明細(主キー, 文字1, 文字2) VALUES (2,'そんな馬鹿な', 'なん、だと')

SELECT * FROM 明細

DROP TABLE 明細

上記のSQLを見て、実行結果がどうなるか即答できる方は多いだろうか?私が最初に見た際、以下の点が気になった。

  • 日本語のテーブル名、カラム名は大丈夫?
  • varcharはどうせ化けるからいいや、nvarcharだけが留意点だな
  • DROPも何もCREATEでこけるかも。。。
  • てか、COLLATE指定しなくても大丈夫?

実行してみたところ、以下の結果となった。なんとすべてのSQLが正常に実行される。

なんというか、、、COLLATEって指定しなくて大丈夫だったっけ???(涙

テーブル生成に関して

内部構造上、SQL Azureではデータ格納時にCLUSTERD INDEXが必須となっている。「日本語関連」の様に主キーが指定されていれば問題ないが、「主キーが存在しない&CLUSTERD INDEXが存在しない」テーブルにINSERTする場合、以下のようにエラーとなる。

この問題を回避するためには、「日本語関連」の例に従って主キーを作成するか、以下の例に従ってCLUSTERD INDEXを作成する必要がある。

CREATE TABLE ダミー(
	アイディー int, 
	文字1 nvarchar(200) NULL,
	文字2 varchar(200) NULL
)

CREATE CLUSTERED INDEX インデックス ON ダミー(アイディー)

INSERT INTO ダミー(文字1, 文字2) VALUES (N'はるたまさんの意地悪!', N'エロゲ')

SELECT * FROM ダミー

DROP TABLE ダミー

まとめ

今回の件に気づいた id:haru-tama さんは流石だなぁと。また、綾貴さんがすでにまとめを公開している。以下もぜひ参照して頂きたい。
蒼の王座 > PDCパブリックビューイング・Windows Azure模試の復習・SQL Azureで日本語