rowversion (Transact-SQL)rowversion (Transact-SQL)

適用対象:○SQL Server (2008 以降)○Azure SQL Database×Azure SQL Data Warehouse ×Parallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

データベース内で自動的に生成され、一意の 2 進数を公開するデータ型です。Is a data type that exposes automatically generated, unique binary numbers within a database. rowversionは通常、テーブルの行のバージョン指定のメカニズムとして使用します。rowversion is generally used as a mechanism for version-stamping table rows. 記憶領域のサイズは 8 バイトです。The storage size is 8 bytes. Rowversionデータ型は、増分する番号だけであり、日付または時刻では保持されません。The rowversion data type is just an incrementing number and does not preserve a date or a time. 録音するには、日付または時刻を使用して、 datetime2データ型。To record a date or time, use a datetime2 data type.

解説Remarks

各データベースを含むテーブルに対して実行される update 操作または挿入ごとにインクリメントされるカウンターには、 rowversionデータベース内の列です。Each database has a counter that is incremented for each insert or update operation that is performed on a table that contains a rowversion column within the database. このカウンターは、データベース rowversion です。This counter is the database rowversion. このカウンターは、時計に関連付けられる実際の時刻ではなく、データベース内の相対的な時間を追跡します。This tracks a relative time within a database, not an actual time that can be associated with a clock. テーブルには、1 つだけ持つことができますrowversion列です。A table can have only one rowversion column. たびを持つ行、 rowversion 、増加したデータベース rowversion 値が挿入で、列が変更または挿入、 rowversion列です。Every time that a row with a rowversion column is modified or inserted, the incremented database rowversion value is inserted in the rowversion column. このプロパティにより、 rowversion列、不適切なキー、特に主キー。This property makes a rowversion column a poor candidate for keys, especially primary keys. 行を更新すると rowversion 値が変わるので、キーの値も変わります。Any update made to the row changes the rowversion value and, therefore, changes the key value. 列が主キー内にある場合、以前のキーの値は無効になり、この以前の値を参照する外部キーも無効になります。If the column is in a primary key, the old key value is no longer valid, and foreign keys referencing the old value are no longer valid. 動的カーソルでテーブルを参照する場合、すべての更新操作はカーソル上の行の位置を変更します。If the table is referenced in a dynamic cursor, all updates change the position of the rows in the cursor. 列がインデックス キー内にある場合、データ行を更新すると、インデックスも更新されます。If the column is in an index key, all updates to the data row also generate updates of the index. Rowversion行の値が変更されていない場合でも、update ステートメントと値が増加します。The rowversion value is incremented with any update statement, even if no row values are changed. (たとえば、列の値が 5、update ステートメント、値を 5 に設定する場合は、この操作と見なされます更新、変更がない場合でも、 rowversionがインクリメントされます)。(For example, if a column value is 5, and an update statement sets the value to 5, this action is considered an update even though there is no change, and the rowversion is incremented.)

タイムスタンプのシノニムには、 rowversionデータを入力し、動作が適用のデータ型のシノニムです。timestamp is the synonym for the rowversion data type and is subject to the behavior of data type synonyms. DDL ステートメントで使用してrowversionの代わりにタイムスタンプ可能な限りです。In DDL statements, use rowversion instead of timestamp wherever possible. 詳細については、次を参照してください。データ型のシノニムと #40 です。TRANSACT-SQL と #41 です。.For more information, see Data Type Synonyms (Transact-SQL).

Transact-SQLTransact-SQL タイムスタンプデータ型が異なる、タイムスタンプISO 規格で定義されているデータ型。The Transact-SQLTransact-SQL timestamp data type is different from the timestamp data type defined in the ISO standard.

注意

タイムスタンプ構文は推奨されません。The timestamp syntax is deprecated. この機能は、Microsoft SQL Server の将来のバージョンで削除されます。This feature will be removed in a future version of Microsoft SQL Server. 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

CREATE TABLE または ALTER TABLE ステートメントでは列名を指定する必要はありません、タイムスタンプデータ型の例を示します。In a CREATE TABLE or ALTER TABLE statement, you do not have to specify a column name for the timestamp data type, for example:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp);  

列名が指定されていない場合、 SQL Server データベース エンジンSQL Server Database Engineが生成されます、タイムスタンプ列の名前です。 ただし、、 rowversionシノニムがこの動作に従っていません。If you do not specify a column name, the SQL Server データベース エンジンSQL Server Database Engine generates the timestamp column name; however, the rowversion synonym does not follow this behavior. 使用するとrowversion、たとえば、列名を指定する必要があります。When you use rowversion, you must specify a column name, for example:

CREATE TABLE ExampleTable2 (PriKey int PRIMARY KEY, VerCol rowversion) ;  

注意

重複してrowversionを SELECT INTO ステートメントを使用して値を生成することができます、 rowversion列が SELECT リストに存在します。Duplicate rowversion values can be generated by using the SELECT INTO statement in which a rowversion column is in the SELECT list. 使用しないでrowversionをこのようにします。We do not recommend using rowversion in this manner.

Null 値非許容rowversion列は同じ意味、 binary (8)列です。A nonnullable rowversion column is semantically equivalent to a binary(8) column. Null 許容型rowversion列は同じ意味、 varbinary (8)列です。A nullable rowversion column is semantically equivalent to a varbinary(8) column.

使用することができます、 rowversion簡単に行を update ステートメントがあるかどうかを決定する行の列が前回読み取られて以降に対して実行します。You can use the rowversion column of a row to easily determine whether the row has had an update statement ran against it since the last time it was read. Update ステートメントが行に対してが実行された場合、rowversion 値が更新されます。If an update statement is ran against the row, the rowversion value is updated. 場合は、行に対して update ステートメントでが実行されませんでした、rowversion 値は前回の読み取り時と同じです。If no update statements are ran against the row, the rowversion value is the same as when it was previously read. データベースの現在の rowversion 値を返すには使用@@DBTSです。To return the current rowversion value for a database, use @@DBTS.

追加することができます、 rowversion列を複数のユーザーが同時に行を更新するときに、データベースの整合性を維持するためにテーブルにします。You can add a rowversion column to a table to help maintain the integrity of the database when multiple users are updating rows at the same time. テーブルに対するクエリを再度実行せずに、行数や更新された行を把握する必要がある場合もあります。You may also want to know how many rows and which rows were updated without re-querying the table.

たとえば、MyTest という名前のテーブルを作成するとします。For example, assume that you create a table named MyTest. 以下を実行して、テーブルにデータを設定する Transact-SQLTransact-SQLステートメントです。You populate some data in the table by running the following Transact-SQLTransact-SQL statements.

CREATE TABLE MyTest (myKey int PRIMARY KEY  
    ,myValue int, RV rowversion);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (2, 0);  
GO  

次に、以下のサンプル Transact-SQLTransact-SQL ステートメントを使用して、更新中に MyTest テーブルにオプティミスティック同時実行制御を実装します。You can then use the following sample Transact-SQLTransact-SQL statements to implement optimistic concurrency control on the MyTest table during the update.

DECLARE @t TABLE (myKey int);  
UPDATE MyTest  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND RV = myValue;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

myValuerowversionを最後に、行を読み取ることを示す行の列の値。myValue is the rowversion column value for the row that indicates the last time that you read the row. 実際、この値を置き換える必要がありますrowversion値。This value must be replaced by the actual rowversion value. 実際の使用例rowversion値は、0x00000000000007d3 などになります。An example of the actual rowversion value is 0x00000000000007D3.

サンプルを追加することもできます。 Transact-SQLTransact-SQLステートメントをトランザクションにします。You can also put the sample Transact-SQLTransact-SQL statements into a transaction. トランザクションの範囲内で @t 変数に対してクエリを実行すると、myKey テーブルに対するクエリを再度実行しなくても、テーブルの更新済みの MyTes 列を取得できます。By querying the @t variable in the scope of the transaction, you can retrieve the updated myKey column of the table without requerying the MyTest table.

同じ例を次に示しますを使用して、タイムスタンプ構文。The following is the same example using the timestamp syntax:

CREATE TABLE MyTest2 (myKey int PRIMARY KEY  
    ,myValue int, TS timestamp);  
GO   
INSERT INTO MyTest2 (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest2 (myKey, myValue) VALUES (2, 0);  
GO  
DECLARE @t TABLE (myKey int);  
UPDATE MyTest2  
SET myValue = 2  
    OUTPUT inserted.myKey INTO @t(myKey)   
WHERE myKey = 1   
    AND TS = myValue;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

参照See also

ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)
CAST および CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)
データ型 (Transact-SQL)Data Types (Transact-SQL)
DECLARE @local_variable (Transact-SQL)DECLARE @local_variable (Transact-SQL)
DELETE (Transact-SQL)DELETE (Transact-SQL)
INSERT (Transact-SQL)INSERT (Transact-SQL)
MIN_ACTIVE_ROWVERSION (です。TRANSACT-SQL と #41 です。MIN_ACTIVE_ROWVERSION (Transact-SQL)
SET @local_variable (Transact-SQL)SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)UPDATE (Transact-SQL)