Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Проследяване на променени полета без поддържане на история

Как да използвате битово поле в TSQL (за актуализации и четения)

Задайте битовото поле по подразбиране на 0 в началото (което означава, че няма промени), трябва да използвате тип int за до 32 бита данни и bigint за до 64 бита данни.

За да зададете бит в битово поле, използвайте | (битов оператор ИЛИ) в израза за актуализиране, например

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

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

и т.н. за всяко поле използвайте 2 на степен N-1 за стойността след |

За да прочетете малко поле, използвайте & (оператор bit AND) и вижте дали е вярно, например

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

забележете, че вероятно няма да използвам текст, тъй като това ще се използва от приложение, нещо подобно ще работи

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

или можете да използвате !=0 по-горе, за да го опростите, както направих в моя тест по-долу

Трябва действително да тествам, за да няма грешки, щракнете за тестовия скрипт

оригинален отговор:

Ако имате по-малко от 16 колони във вашата таблица, можете да съхраните "флаговете" като цяло число, след което да използвате метода на битов флаг, за да посочите колоните, които са се променили. Просто игнорирайте или не си правете труда да маркирате тези, които не ви интересуват.

Следователно, ако флаговото поле BOOLEAN AND 2^N е вярно, това показва, че N-тото поле е променено.

Или пример за max от N =2

0 - нищо не се е променило (всички битове 0)

1 - поле 1 е променено (първи бит 1)

2 - поле 2 е променено (втори бит 1)

3 - поле 1+2 променено (първи и втори бит 1)

вижте тази връзка за по-добро определение: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. Изчисляване на стойност с помощта на предишна стойност на ред в T-SQL

  2. SSRS 2005 намира име на колона с максимална стойност

  3. Потребителят не е свързан с доверена връзка на SQL Server

  4. Транспонираща таблица

  5. Грешка в T-Sql при използване на курсора