SQL:SQL Server 2005 MAXキーワード
この文書はSQL Server 2000 SP4, SQL Server 2005 CTP June/2005時点をベースに記述されています。
SQL Server 2005からはMAXキーワードが追加になります。このキーワードは今までサイズが制約されてきたnvarchar、役割自身が制約的なntextの中間に位置するような、広いデータを格納できるnvarcharデータだ。(nvarcharにはかぎらないが)maxキーワードはCreate Tableのドキュメントを見ると
Applies only to the varchar, nvarchar, and varbinary data types for storing 2^31 bytes of character and binary data, and 2^30 bytes of Unicode data.
このように記述されており、3つの型で利用することができ、最大サイズは2^31バイトということがわかる。
河端さんが懸念されていたのは、maxなら、どんな大きなサイズが投入されてもいいのか?という話がありました。
LENのドキュメントを見ると
bigint if expression is of the varchar(max), nvarchar(max) or varbinary(max) data types; otherwise, int.
このように、通常はintだけど、maxの物の場合にはbigintで返しますよとのこと。
ということは、maxなものでもきちんとサイズが取れることは間違いない。
であればCHECKを使えば最大サイズの検出はできるはず。
CREATE TABLE [dbo].[TA]( [id] [int] IDENTITY(1,1) NOT NULL, [var] [nvarchar](max) COLLATE Japanese_CI_AS NULL, CONSTRAINT [PK_TA] PRIMARY KEY CLUSTERED ( [id] ASC ) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[TA] WITH CHECK ADD CONSTRAINT [CK_TA] CHECK ((LEN([var])<(10))) GO
このようなテーブルを作成して、
INSERT INTO [ta]([var]) VALUES ('1234567890')
このようなinsertを流すと
メッセージ 547、レベル 16、状態 0、行 1 INSERT ステートメントは CHECK 制約 "CK_TA" と競合しています。 競合が発生したのは、データベース "test"、テーブル "TA", column 'var' です。
このようにきちんと制約がかかっていることが確認できる。どのようなデータを格納してもいいというのでなければ制約を掛けてしまうほうがいいだろう。