Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Śledzenie zmienionych pól bez prowadzenia historii

Jak używać pola bitowego w TSQL (do aktualizacji i odczytów)

Ustaw pole bitowe na domyślną wartość 0 na początku (co oznacza brak zmian), powinieneś użyć typu int dla maksymalnie 32 bitów danych i bigint dla maksymalnie 64 bitów danych.

Aby ustawić bit w polu bitowym, użyj | (operator bitu OR) w instrukcji aktualizacji, na przykład

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

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

itd. dla każdego pola użyj liczby od 2 do potęgi N-1 dla wartości po |

Aby odczytać pole bitowe, użyj & (operator bitu AND) i sprawdź, czy to prawda, na przykład

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

uwaga Prawdopodobnie nie używałbym tekstu, ponieważ będzie on używany przez aplikację, coś takiego będzie działać

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

lub możesz użyć !=0 powyżej, aby uprościć to, co zrobiłem w moim teście poniżej

Musisz faktycznie przetestować, aby nie było błędów, kliknij, aby zobaczyć skrypt testowy

oryginalna odpowiedź:

Jeśli masz mniej niż 16 kolumn w tabeli, możesz przechowywać „flagi” jako liczbę całkowitą, a następnie użyć metody flag bitowych, aby wskazać kolumny, które uległy zmianie. Po prostu zignoruj ​​lub nie zawracaj sobie głowy oznaczaniem tych, na których ci nie zależy.

Zatem jeśli pole flagowe BOOLEAN AND 2^N jest prawdziwe, oznacza to, że zmieniło się N-te pole.

Lub przykład dla max N =2

0 - nic się nie zmieniło (wszystkie bity 0)

1 - pole 1 zmienione (pierwszy bit 1)

2 - pole 2 zmienione (drugi bit 1)

3 - zmieniono pole 1+2 (pierwszy i drugi bit 1)

zobacz ten link, aby uzyskać lepszą definicję:http://en.wikipedia.org/wiki/Bit_field



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skonfiguruj zawsze włączone grupy dostępności programu SQL Server między dwiema replikami synchronicznymi. Część 2

  2. Komentowany kod zgłasza błąd

  3. Obliczanie czasu trwania SQL

  4. kwerenda sql do dynamicznego dodawania miesiąca obrachunkowego za pomocą funkcji pivot

  5. Czy istnieje sposób na dekodowanie HTML w SQL Server?