valor utiliza una tiene tabla sólo solo siempre realizar puede propiedad para operación off lista insertar identity_insert identidad generada explícito está especificarse especificar datos cuando con columnas columna cambiar activado sql sql-server-2008 insert timestamp

sql - tiene - solo se puede especificar cuando se utiliza una lista de columnas y identity_insert está activado



SQL Server: no se puede insertar un valor explícito en una columna de marca de tiempo (6)

Al usar esta declaración

create table demo ( ts timestamp ) insert into demo select current_timestamp

Obtuve el siguiente error:

No se puede insertar un valor explícito en una columna de marca de tiempo. Use INSERT con una lista de columnas para excluir la columna de marca de tiempo, o inserte un DEFAULT en la columna de marca de tiempo

¿Cómo inserto la hora actual en una columna de timestamp ?


Cómo insertar la hora actual en una marca de tiempo con SQL Server:

Respuesta: No puedes, y aquí está el por qué.

En las versiones más recientes de SQL Server, la timestamp se renombra a RowVersion . Con razón, porque la marca de tiempo es muy engañosa.

La marca de tiempo de SQL Server NO está establecida por el usuario y no representa una fecha u hora. la marca de tiempo es solo una representación binaria de un número consecutivo, solo es bueno para asegurarse de que una fila no haya cambiado desde que se leyó.

Si desea almacenar una fecha o una hora, no use la marca de tiempo, debe usar uno de los otros tipos de datos, como por ejemplo datetime , smalldatetime , date , time o DATETIME2

Por ejemplo:

create table wtf ( id INT, leet timestamp ) insert into wtf (id) values (15) select * from wtf 15 0x00000000000007D3

Así que la marca de tiempo es una especie de número binario. ¿Qué pasa si tratamos de enviarlo a datetime?

select CAST(leet AS datetime) from wtf 1900-01-01 00:00:06.677

El año actual para mí no es 1900. Por lo tanto, no estoy seguro de qué está pensando SQL Server.


No puede insertar los valores en la columna timestamp explícitamente. Se genera automáticamente. No use esta columna en su declaración de inserción. Consulte http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx para obtener más detalles.

Puede usar una fecha y hora en lugar de una marca de tiempo como esta:

create table demo ( ts datetime ) insert into demo select current_timestamp select ts from demo

Devoluciones:

2014-04-04 09:20:01.153


Si necesita copiar exactamente los mismos datos de marca de tiempo, cambie el tipo de datos en la tabla de destino de timestamp a binary (8) - utilicé varbinary (8) y funcionó bien.

Obviamente, esto rompe cualquier funcionalidad de marca de tiempo en la tabla de destino, así que asegúrese de estar bien con eso primero.


Suponga que Table1 y Table2 tienen tres columnas A, B y TimeStamp. Quiero insertar desde Table1 en Table2.

Esto falla con el error de marca de tiempo:

Insert Into Table2 Select Table1.A, Table1.B, Table1.TimeStamp From Table1

Esto funciona:

Insert Into Table2 Select Table1.A, Table1.B, null From Table1


crear una demostración de tabla (id int, ts timestamp)

insertar en valores de demostración (id, ts) (1, PREDETERMINADO)


De acuerdo con MSDN , timestamp

Es un tipo de datos que expone números binarios únicos generados automáticamente dentro de una base de datos. la marca de tiempo generalmente se usa como un mecanismo para las filas de la tabla de estampado de versiones. El tamaño de almacenamiento es de 8 bytes. El tipo de datos de marca de tiempo es solo un número creciente y no conserva una fecha o una hora. Para registrar una fecha u hora, use un tipo de datos de fecha y hora.

Probablemente esté buscando el tipo de datos de datetime .