web-dev-qa-db-ja.com

SQL Server2000の複数のタイムスタンプ列

SQL Server2000でテーブルを作成する必要があります。

create table TABLE (
        DBID_ bigint not null,
        CLASS_ varchar(255) not null,
        DBVERSION_ integer not null,
        HPROCI_ bigint,
        TYPE_ varchar(255),
        EXECUTION_ varchar(255),
        ACTIVITY_NAME_ varchar(255),
        START_ timestamp,
        END_ timestamp,
        DURATION_ bigint,
        TRANSITION_ varchar(255),
        NEXTIDX_ integer,
        HTASK_ bigint,
        primary key (DBID_)
    );

実行するとエラーが発生します。

テーブルに含めることができるタイムスタンプ列は1つだけです。テーブルTABLEにはすでに1つあるため、列END_追加できません。

SQLServerのtimestampの最良の代替手段は何ですか?この問題を修正する方法は?

13
p_anantha

timestampは、名前が示すように日時データ型ではありません。これはサーバーのクロックに対してrelativeである内部値ですが、実際の時刻はその値から導出できません。これは単に行が更新されたかどうかを評価するために使用されるため、テーブルにはこのタイプの列を1つだけ含めることができます。 timestamp構文は実際には非推奨になり、名前が rowversion になりました。これは、はるかに理にかなっています。

列名(Start、End)を指定すると、実際のタイムスタンプを保存しようとしていると想定し、代わりにデータ型としてdatetimeを使用する必要があります。

38
Nathan Skerl

SQL Serverでは、timestampはデータ型であり、時間ではありません。これは基本的にレコードをバージョン管理する方法であり、切断されたデータベースモデルでの楽観的ロックに使用されます。レコードをロードするときに、タイムスタンプ列を取得します。タイムスタンプ列の値が同じである場合にのみ書き戻します。これは、取得してから他の誰も変更していないことを意味します。

実際のdatetime値が必要な場合は、null以外の日時を追加するか、デフォルトをGetDate()にして、更新のたびに更新することを忘れないでください。

2
Tony Hopkinson