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
.