中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

SQL Server 2005 MAXキーワード

この情報の最新版はこちら

http://naka.wankuma.com/site/column/server/00002.htm


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' です。

このようにきちんと制約がかかっていることが確認できる。どのようなデータを格納してもいいというのでなければ制約を掛けてしまうほうがいいだろう。

投稿日時 : 2005年6月10日 13:59

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント