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

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Es un tipo de datos que expone números binarios únicos generados automáticamente en una base de datos.Is a data type that exposes automatically generated, unique binary numbers within a database. rowversion se suele usar como mecanismo para marcar la versión de las filas de la tabla.rowversion is generally used as a mechanism for version-stamping table rows. El tamaño de almacenamiento es de 8 bytes.The storage size is 8 bytes. El tipo de datos rowversion es simplemente un número que se incrementa y no conserva una fecha o una hora.The rowversion data type is just an incrementing number and does not preserve a date or a time. Para registrar una fecha o una hora, use un tipo de datos datetime2.To record a date or time, use a datetime2 data type.

NotasRemarks

Cada base de datos tiene un contador que se incrementa por cada operación de inserción o actualización que se lleva a cabo en una tabla que contiene una columna rowversion en la base de datos.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. Este contador es la versión de fila (rowversion) de la base de datos.This counter is the database rowversion. Realiza un seguimiento de una hora relativa de una base de datos, no una hora real que pueda asociarse con un reloj.This tracks a relative time within a database, not an actual time that can be associated with a clock. Una tabla solo puede tener una columna rowversion.A table can have only one rowversion column. Cada vez que se modifica o inserta una fila con una columna rowversion, el valor rowversion de la base de datos incrementado se inserta en la columna 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. Esta propiedad hace que una columna rowversion sea un mal candidato para claves, especialmente claves principales.This property makes a rowversion column a poor candidate for keys, especially primary keys. Cualquier actualización de la fila hace que cambie el valor rowversion, con lo que cambia el valor de la clave.Any update made to the row changes the rowversion value and, therefore, changes the key value. Si la columna está en una clave principal, el valor de la clave principal antigua deja de ser válido, así como las claves externas que hacen referencia al valor antiguo.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. Si se hace referencia a la tabla en un cursor dinámico, todas las actualizaciones cambian la posición de las filas en el cursor.If the table is referenced in a dynamic cursor, all updates change the position of the rows in the cursor. Si la columna es una clave de índice, todas las actualizaciones de la fila de datos también generan actualizaciones del índice.If the column is in an index key, all updates to the data row also generate updates of the index. El valor de rowversion se incrementa con cualquier instrucción de actualización, incluso si ningún valor de fila cambia.The rowversion value is incremented with any update statement, even if no row values are changed. Por ejemplo, si un valor de columna es 5 y una instrucción de actualización establece el valor en 5, esta acción se considera una actualización, aun cuando no hay cambio alguno, y rowversion aumenta.(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.)

timestamp es el sinónimo del tipo de datos rowversion y está sujeto al comportamiento de los sinónimos de tipos de datos.timestamp is the synonym for the rowversion data type and is subject to the behavior of data type synonyms. En las instrucciones DDL, use rowversion en lugar de timestamp siempre que sea posible.In DDL statements, use rowversion instead of timestamp wherever possible. Para más información, vea Sinónimos de tipos de datos (Transact-SQL).For more information, see Data Type Synonyms (Transact-SQL).

El tipo de datos timestamp de Transact-SQLTransact-SQL es distinto del tipo de datos timestamp definido en el estándar ISO.The Transact-SQLTransact-SQL timestamp data type is different from the timestamp data type defined in the ISO standard.

Nota

La sintaxis de timestamp está en desuso.The timestamp syntax is deprecated. Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión futura de Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

En una instrucción CREATE TABLE o ALTER TABLE, no tiene que especificar ningún nombre de columna para el tipo de datos timestamp, por ejemplo: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);  

Si no especifica un nombre de columna, el Motor de base de datos de SQL ServerSQL Server Database Engine genera el nombre de columna timestamp; el sinónimo de rowversion, en cambio, no sigue este comportamiento.If you do not specify a column name, the Motor de base de datos de SQL ServerSQL Server Database Engine generates the timestamp column name; however, the rowversion synonym does not follow this behavior. Cuando usa rowversion, debe especificar un nombre de columna, por ejemplo:When you use rowversion, you must specify a column name, for example:

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

Nota

Se pueden generar valores rowversion duplicados con la instrucción SELECT INTO en la que una columna rowversion está en la lista SELECT.Duplicate rowversion values can be generated by using the SELECT INTO statement in which a rowversion column is in the SELECT list. No se recomienda usar rowversion de esta manera.We do not recommend using rowversion in this manner.

Una columna rowversion que no admite valores NULL equivale semánticamente a una columna binary(8).A nonnullable rowversion column is semantically equivalent to a binary(8) column. Una columna rowversion que admite valores NULL equivale semánticamente a una columna varbinary(8).A nullable rowversion column is semantically equivalent to a varbinary(8) column.

Puede usar la columna rowversion de una fila para saber fácilmente si se ha ejecutado una instrucción de actualización en esa fila desde la última vez que se leyó.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. Si se ha ejecutado una instrucción de actualización en la fila, el valor rowversion se actualiza.If an update statement is ran against the row, the rowversion value is updated. Si no se ha ejecutado una instrucción de actualización en la fila, el valor rowversion es el mismo que el de la lectura anterior.If no update statements are ran against the row, the rowversion value is the same as when it was previously read. Para devolver el valor rowversion actual de una base de datos, use @@DBTS.To return the current rowversion value for a database, use @@DBTS.

Puede agregar una columna rowversion a una tabla para ayudar a mantener la integridad de la base de datos cuando varios usuarios actualizan filas al mismo tiempo.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. También puede que desee conocer cuántas filas y qué filas se actualizaron sin volver a consultar la tabla.You may also want to know how many rows and which rows were updated without re-querying the table.

Por ejemplo, suponga que crea una tabla denominada MyTest.For example, assume that you create a table named MyTest. Rellena algunos datos en la tabla ejecutando las siguientes instrucciones 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  

A continuación, puede utilizar las instrucciones de Transact-SQLTransact-SQL de ejemplo siguientes para implementar el control de simultaneidad optimista en la tabla MyTest durante la actualización.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 = myRv;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

myRv es el valor de columna rowversion para la fila que indica la última vez que lee la fila.myRv is the rowversion column value for the row that indicates the last time that you read the row. El valor rowversion real debe reemplazar a este valor.This value must be replaced by the actual rowversion value. Un ejemplo del valor rowversion real es 0x00000000000007D3.An example of the actual rowversion value is 0x00000000000007D3.

Las instrucciones Transact-SQLTransact-SQL de ejemplo también se pueden incluir en una transacción.You can also put the sample Transact-SQLTransact-SQL statements into a transaction. Al consultar la variable @t en el ámbito de la transacción, puede recuperar la columna myKey actualizada de la tabla sin consultar de nuevo la tabla 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.

En el siguiente ejemplo se usa la sintaxis de timestamp: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 = myTS;  
IF (SELECT COUNT(*) FROM @t) = 0  
    BEGIN  
        RAISERROR ('error changing row with myKey = %d'  
            ,16 -- Severity.  
            ,1 -- State   
            ,1) -- myKey that was changed   
    END;  

Vea tambiénSee also

ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)
CAST y CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)
Tipos de datos (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)MIN_ACTIVE_ROWVERSION (Transact-SQL)
SET @local_variable (Transact-SQL)SET @local_variable (Transact-SQL)
UPDATE (Transact-SQL)UPDATE (Transact-SQL)