中の技術日誌ブログ

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

目次

Blog 利用状況

ニュース

自己紹介

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

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

Identity Seedは決定的でないとだめ2

Identity Seedは決定的でないとだめ
http://blogs.wankuma.com/naka/archive/2005/06/01/11450.aspx

とりあえず使えるようになるといいなと思ってMicrosoftにはWishしておきました。
#まぁYukonはむりだろうから、その次あたりで(^^

まとめページ作りました。

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


この文書はSQL Server 2000 SP4, SQL Server 2005 CTP Apr/2005時点をベースに記述されています。

クエリでテーブル(一時テーブルを含む)を作成する場合に、Identityを利用するテーブルを作ることも多いでしょう。

Create Table [#AAA]
(
  [key] int not null identity(1, 1),
  [data] nvarchar(10)
)

このように決定的なSeedを設定すると無事Identityを利用するテーブルを作成できます。

しかし・・・

declare @IdentitySeed int
set @IdentitySeed = 50
Create Table [#AAA]
(
  [key] int not null identity(@IdentitySeed, 1),
  [data] nvarchar(10)
)

このようにIdentity Seedを変数にすることは出来ません。

サーバー : メッセージ 170、レベル 15、状態 1、行 6
行 6: '@IdentitySeed' の近くに無効な構文があります。

解決策としては下記の2つの方法があります。

declare @IdentitySeed int
set @IdentitySeed = 50
Create Table [#AAA]
(
  [key] int not null identity(1, 1),
  [data] nvarchar(10)
)
DBCC CHECKIDENT ([#AAA], RESEED, @IdentitySeed)

米田さんが教えてくれたDBCC CHECKIDENTを使う方法です。一度作成するときには適当な値で設定しておく必要がありますが、即座にDBCC CHECKIDENTすれば、その値になります。

declare @IdentitySeed int
set @IdentitySeed=50
declare @CreateQuery nvarchar(4000)
set @CreateQuery = '
Create Table [##AAA]
(
  [key] int not null Identity(' + Convert(nvarchar, @IdentitySeed) + ', 1),
  [data] nvarchar(10)
)'
exec(@CreateQuery)

これはBryanさんの案です。

通常の動的SQLで解こうという案です。

ただし一時テーブルでもグローバル一時テーブルにしないといけないし、文字数を考えておかないといけないので、ちょっとデメリットも多いです。

SQL Server 2005になると、nvarchar(max)という構文が使えるようになるので、長いテーブル構築でも出来るようになるので、ややデメリットが減ります。

とりあえずの解決策はありますが、対応してほしいですね。

投稿日時 : 2005年6月2日 22:52

コメントを追加

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