sql >> Base de Datos >  >> RDS >> Sqlserver

Seguimiento de campos modificados sin mantener el historial

Cómo usar un campo de bits en TSQL (para actualizaciones y lecturas)

Establezca el campo de bits predeterminado en 0 al inicio (lo que significa que no hay cambios). Debe usar type int para hasta 32 bits de datos y bigint para hasta 64 bits de datos.

Para establecer un bit en un campo de bits, use el | (operador bit OR) en la declaración de actualización, por ejemplo

UPDATE table 
SET field1 = 'new value', bitfield = bitfield | 1

UPDATE table 
SET field2 = 'new value', bitfield = bitfield | 2

etc. para cada campo use el 2 elevado a N-1 para el valor después del |

Para leer un campo de bit use & (operador bit AND) y ver si es cierto, por ejemplo

SELECT field1, field2,
       CASE WHEN (bitfield & 1) = 1 THEN 'field1 mod' ELSE 'field1 same' END,
       CASE WHEN (bitfield & 2) = 2 THEN 'field2 mod' ELSE 'field2 same' END
FROM table

tenga en cuenta que probablemente no usaría texto ya que esto será utilizado por una aplicación, algo como esto funcionará

SELECT field1, field2,
        CASE WHEN (bitfield & 1) = 1 THEN 1 ELSE 0 END AS [field1flag],
        CASE WHEN (bitfield & 2) = 2 THEN 1 ELSE 0 END AS [field2flag]
FROM table

o puede usar !=0 arriba para hacerlo simple como lo hice en mi prueba a continuación

Debe probar para no tener errores, haga clic en el script de prueba

respuesta original:

Si tiene menos de 16 columnas en su tabla, puede almacenar las "banderas" como un número entero y luego usar el método de bandera de bits para indicar las columnas que cambiaron. Simplemente ignore o no se moleste en marcar los que no le interesan.

Por lo tanto, si flagfield BOOLEAN AND 2^N es verdadero, indica que el campo N ha cambiado.

O un ejemplo para un máximo de N =2

0 - nada ha cambiado (todos los bits 0)

1 - campo 1 cambiado (primer bit 1)

2 - campo 2 cambiado (segundo bit 1)

3 - campo 1+2 cambiado (primer y segundo bit 1)

vea este enlace para una mejor definición:http://en.wikipedia.org/wiki/Bit_field