2011-01-04 20 views
19

Nel mio database ho una colonna timestamp. Devo aggiornare una riga nella tabella e devo aggiornare la colonna timestamp. Quando eseguo un comando di aggiornamento ottengo:SQL Server che aggiorna una colonna timestamp

Cannot update a timestamp column. 

Come posso aggiornare la colonna del timestamp?

risposta

28

non si

Il timestamp column is updated automatically. Forse hai l'impressione che il timestamp contenga un valore relativo al tempo? Non è così, ma semplicemente è un numero che viene aggiornato ogni volta che un valore in quel record è. Pensa a un numero di versione di riga.

Da MSDN: tipo di dati

Il timestamp è solo un numero incrementale e non conserva una data o un tempo.

+9

Molto intuitivo nominare lì, non è vero ...: P –

+1

@JacquesBosch - Sono d'accordo è molto fuorviante –

2

non si aggiorna la colonna timestamp - un timestamp (ora rinominato rowversion) colonna viene aggiornata automaticamente dal server di SQL ogni volta che qualsiasi altra colonna della riga viene aggiornata.


Se già lo sapeva, ma per qualche motivo vuole forzare la colonna da aggiornare, basta eseguire un aggiornamento contro la fila che si desidera interessata. Anche se si traduce in nessun cambiamento dei dati reali, la colonna timestamp sarà ancora aggiornato:

create table #T1 (
    ID int not null, 
    ts timestamp not null 
) 
insert into #T1 (ID) 
select 1 union all 
select 2 
select * from #T1 
update #T1 set ID = ID where ID=1 
select * from #T1 

ID ts 
1 0x0000000000039AAF 
2 0x0000000000039AB0 

ID ts 
1 0x0000000000039AB1 
2 0x0000000000039AB0 
2

Anche se la mia non è una risposta alla tua domanda che volevo parlare di quanto TIMESTAMP può essere frainteso.

Non si indica l'uso della colonna TIMESTAMP nella domanda, ma il fatto che si sta tentando di aggiornarlo implica (per me) che si sta tentando di registrare quando i dati cambiano.

Dai un'occhiata a this article (ce ne sono molti altri in rete) riguardo l'utilizzo di TIMESTAMP quando in realtà vuoi registrare la modifica utilizzando DATETIME.

BOL dice:

di SQL Server timestamp tipo di dati non ha nulla a che fare con i tempi o date. I timestamp SQL Server sono numeri binari che indicano la relativa sequenza in cui le modifiche dei dati si sono svolte in un database. Il tipo di data/ora era originariamente implementato per supportare gli algoritmi di recupero di SQL Server .

Come Damien_The_Unbeliever dice che il tipo sia stato rinominato e la descrizione dice: tipo di dati

Il rowversion è solo un numero incrementale e non conserva una data o un momento.Per registrare una data o un'ora , utilizzare un tipo di datetime2 .

Naturalmente, se si utilizza il tipo di dati nel modo inteso ignorare tutto quanto sopra :)

+0

Non è possibile memorizzare la data e l'ora in una colonna TIMESTAMP quindi non c'è nulla di cui essere cauti. Penso che questa risposta sia fuorviante. –

+1

@ m.edmondson: hai ragione, la formulazione della mia risposta è un po 'fuorviante. Non stavo dicendo che Sally stava cercando di inserire un valore datetime nella colonna TIMESTAMP, solo che a volte le persone sono indotte a pensare che TIMESTAMP fornirà una registrazione automatica del momento in cui è stata effettuata una modifica, quindi prova ad estrarre Risultati DATETIME dai dati. – Tony

1
colonna

timestamp non può essere aggiornata in quanto è generato server e viene gauranteed per essere unico per l'intero database: se gli aggiornamenti sono consentiti, ma non lo sono, il valore non è garantito per essere univoco.

Ho affrontato lo stesso problema cercando di aggiornare la colonna timestamp in un'istanza replicata perché l'istanza replicata non aveva lo stesso valore di timestamp del publisher - che ha causato alcuni problemi durante il tentativo di ottenere l'ultimo record aggiornato per gruppo di record. naturalmente, con la replica, era semplice configurare l'editore per consentire lo stesso valore di timestamp da replicare al sottoscrittore.

altrimenti, non c'è altro modo per aggiornare un valore di data e ora.

0

Ho avuto lo stesso problema, la mia soluzione:

UPDATE [table] 
SET [ANY_COLUMN] = [ANY_COLUMN] 
WHERE ID = [ID] 

come ogni volta quando un valore di tabella di cambiare il timestamp viene ricalcolato, aggiorno qualsiasi colonna allo stesso valore, pertanto il timestamp viene aggiornato

Problemi correlati