Solución:
No quiero usar un número entero, porque no quiero tener que leer el valor para incrementarlo.
UPDATE Table SET
IntColumn = IntColumn + 1
Si bien eso técnicamente requiere una lectura, no veo ningún problema con eso.
Siempre puede actualizar al mismo valor:
UPDATE Table SET
SomeColumn = SomeColumn
que también activará la actualización de rowversion.
ADICIÓN: podría hacer una vista con la versión de fila máxima de los niños:
SELECT Parent.*, MaxChildRowVersion as ChildVersion
FROM Parent
JOIN (
SELECT ParentId, MAX(RowVersion) as MaxChildRowVersion
FROM Child
GROUP BY ParentId
) as Child ON
Parent.ParentId = Child.ParentId
Pero, no, no puede actualizar directamente una columna de versión de fila (aunque podría implementar su propio actualizable con @@ DBTS, binary (8) e INSTEAD OF triggers …)
¿Podría dar ejemplos de su último punto? Suena prometedor.
No, realmente no es así. 😉 Es demasiado trabajo cuando simplemente puede actualizar al mismo valor o usar una vista. Esas son las 2 opciones más fáciles.
Pero, para estar completo, una columna binaria (8) con un valor predeterminado de @@ DBTS (que devuelve el número de versión de la base de datos), y un disparador DESPUÉS DE ACTUALIZAR que también actualiza la columna binaria al nuevo @@ DBTS le dará un psuedo -tipo de versión de actualización que luego puede actualizar manualmente. Sin embargo, no sería más rápido ni mejor que simplemente actualizar alguna otra columna a su mismo valor.
Ronnie,
Primero de todo el timestamp
Microsoft ha dejado de utilizar la sintaxis, por lo que debe utilizar rowversion
, segundo el rowversion
siempre está relacionado con la fila.
De la documentación:
rowversion
Cada base de datos tiene un contador que se incrementa para cada operación de inserción o actualización que se realiza en una tabla que contiene un rowversion columna dentro de la base de datos. Este contador es la base de datos rowversion.
Sin embargo, debido a la forma en que se implementa en el servidor SQL, debe usar desencadenadores para lograr lo que desea.
Algo como esto:
CREATE TRIGGER tgUpdateParentRowVersion ON ChildTable FOR INSERT, DELETE, UPDATE
AS
BEGIN
/*
* The updates below force the update of the parent table rowversion
*/
UPDATE ParentTable
SET ChildUpdate = ChildUpdate + 1
FROM ParentTable a
JOIN inserted i on a.pkParentTable = i.fkParentTable
UPDATE ParentTable
SET ChildUpdate = ChildUpdate - 1
FROM ParentTable a
JOIN deleted d on a.pkParentTable = d.fkParentTable
END
Lo crea o no, esto actualiza una columna RowVersion / Timestamp sin establecer una columna. Aviso @[email protected]
es la única cláusula después de set
. Estoy usando Sql Server 2017.
declare @foo nvarchar(50);
update dbo.MyTable
set @foo = @foo
where Id = @id