sql >> Databasteknik >  >> RDS >> Sqlserver

Spåra ändrade fält utan att upprätthålla historik

Hur man använder ett bitfält i TSQL (för uppdateringar och läsningar)

Ställ in bitfältet som standard till 0 vid start (vilket betyder inga ändringar) du bör använda typ int för upp till 32 bitar data och bigint för upp till 64 bitar data.

För att ställa in en bit i ett bitfält använd | (bit OR-operator) i uppdateringssatsen, till exempel

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

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

etc för varje fält använd 2 till potens av N-1 för värdet efter |

För att läsa ett bitfält använd & (bit OCH operator) och se om det är sant, till exempel

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

notera att jag förmodligen inte skulle använda text eftersom detta kommer att användas av en applikation, något sånt här kommer att fungera

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

eller så kan du använda !=0 ovan för att göra det enkelt som jag gjorde i mitt test nedan

Måste faktiskt testa

originalsvar:

Om du har mindre än 16 kolumner i din tabell kan du lagra "flaggorna" som ett heltal och sedan använda bitflaggametoden för att indikera kolumnerna som ändrades. Bara ignorera eller bry dig inte om att markera de som du inte bryr dig om.

Så om flaggfältet BOOLEAN AND 2^N är sant indikerar det att det N:te fältet ändrats.

Eller ett exempel på max N =2

0 - ingenting har ändrats (alla bitar 0)

1 - fält 1 ändrat (första bit 1)

2 - fält 2 ändrat (andra bit 1)

3 - fält 1+2 ändrats (första och andra bit 1)

se denna länk för en bättre definition:http://en.wikipedia.org/wiki/Bit_field



  1. =) Operatör för nybörjare

  2. Oracle:Hur man skapar en funktion som returnerar värden för en SELECT * FROM-flik WHERE name IN (function())

  3. Anslut SAP IQ till SQL Server

  4. Mysql-tabellstorlek på hårddisken