SQL Server: impossible d’insérer une valeur explicite dans une colonne d’horodatage

Lors de l’utilisation de cette déclaration

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

Je reçois l’erreur suivante:

Impossible d’insérer une valeur explicite dans une colonne d’horodatage. Utilisez INSERT avec une liste de colonnes pour exclure la colonne d’horodatage ou insérez un DEFAULT dans la colonne d’horodatage.

Comment insérer l’heure actuelle dans une colonne d’ timestamp ?

Selon MSDN , timestamp

Est un type de données qui expose des nombres binarys uniques générés automatiquement dans une firebase database. timestamp est généralement utilisé comme mécanisme pour estamper les lignes du tableau. La taille de stockage est de 8 octets. Le type de données d’horodatage est simplement un nombre incrémenté et ne conserve pas une date ou une heure. Pour enregistrer une date ou une heure, utilisez un type de données datetime.

Vous recherchez probablement le type de données datetime la place.

Si vous avez besoin de copier exactement les mêmes données d’horodatage, changez le type de données dans la table de destination de timestamp à binary (8) – j’ai utilisé varbinary (8) et cela a bien fonctionné.

Cela rompt évidemment toute fonctionnalité d’horodatage de la table de destination, assurez-vous d’être d’accord avec cela.

Vous ne pouvez pas insérer les valeurs dans la colonne timestamp explicitement. Il est généré automatiquement. N’utilisez pas cette colonne dans votre instruction d’insertion. Référez-vous à http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx pour plus de détails.

Vous pouvez utiliser un datetime au lieu d’un horodatage comme celui-ci:

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

Résultats:

 2014-04-04 09:20:01.153 

Comment insérer l’heure actuelle dans un horodatage avec SQL Server:

Réponse: Vous ne pouvez pas et voici pourquoi.

Dans les nouvelles versions de SQL Server, l’ timestamp est renommé en RowVersion . À juste titre, car l’horodatage est très trompeur.

L’horodatage SQL Server N’EST PAS défini par l’utilisateur et ne représente pas une date ou une heure. timestamp est juste une représentation binary d’un nombre consécutif, c’est seulement une bonne chose pour s’assurer qu’une ligne n’a pas changé depuis sa lecture.

Si vous souhaitez stocker une date ou une heure, n’utilisez pas d’horodatage, vous devez utiliser l’un des autres types de données, comme par exemple datetime , smalldatetime , date , time ou DATETIME2

Par exemple:

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

L’horodatage est donc une sorte de nombre binary. Que se passe-t-il si nous essayons de le lancer à datetime?

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

L’année en cours pour moi n’est pas 1900. Je ne suis donc pas sûr de ce que pense SQL Server.

Supposons que Table1 et Table2 ont trois colonnes A, B et TimeStamp. Je veux insérer du tableau 1 au tableau 2.

Cela échoue avec l’erreur d’horodatage:

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

Cela marche:

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

créer une démo de table (id int, ts timestamp)

insérer dans les valeurs de démonstration (id, ts) (1, DEFAULT)