Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Theo dõi các trường đã thay đổi mà không cần duy trì lịch sử

Cách sử dụng trường bit trong TSQL (để cập nhật và đọc)

Đặt trường bit thành mặc định là 0 khi bắt đầu (nghĩa là không có thay đổi), bạn nên sử dụng kiểu int cho tối đa 32 bit dữ liệu và bigint cho tối đa 64 bit dữ liệu.

Để đặt một bit trong trường bit, hãy sử dụng | (toán tử OR bit) trong câu lệnh cập nhật, ví dụ

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

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

vv cho mỗi trường sử dụng 2 thành lũy thừa của N-1 cho giá trị sau |

Để đọc trường bit, hãy sử dụng & (toán tử bit AND) và xem nó có đúng không, chẳng hạn

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

lưu ý rằng tôi có thể sẽ không sử dụng văn bản vì văn bản này sẽ được ứng dụng sử dụng, một cái gì đó như thế này sẽ hoạt động

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

hoặc bạn có thể sử dụng! =0 ở trên để làm cho nó đơn giản như tôi đã làm trong thử nghiệm của mình bên dưới

Phải kiểm tra thực tế để không có lỗi, nhấp vào để biết tập lệnh kiểm tra

câu trả lời ban đầu:

Nếu bạn có ít hơn 16 cột trong bảng của mình, bạn có thể lưu trữ "cờ" dưới dạng số nguyên, sau đó sử dụng phương pháp cờ bit để chỉ ra các cột đã thay đổi. Chỉ cần bỏ qua hoặc không bận tâm đánh dấu những cái mà bạn không quan tâm.

Vì vậy, nếu trường cờ BOOLEAN VÀ 2 ^ N là true, nó chỉ ra rằng trường thứ N đã thay đổi.

Hoặc một ví dụ cho tối đa N =2

0 - không có gì thay đổi (tất cả các bit 0)

1 - trường 1 đã thay đổi (bit đầu tiên 1)

2 - trường 2 đã thay đổi (bit thứ hai 1)

3 - trường 1 + 2 đã thay đổi (bit đầu tiên và thứ hai 1)

xem liên kết này để có định nghĩa tốt hơn: 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. Rò rỉ bộ nhớ trong ứng dụng .net

  2. Nối nhiều bảng trả về giá trị NULL

  3. Truy vấn sql với các ký tự đặc biệt - làm thế nào để xử lý?

  4. Khi chèn các cột mới vào một cơ sở dữ liệu trong VB 2010, làm cách nào để cập nhật Cơ sở dữ liệu SQL Server 2008?

  5. Làm cách nào để bạn xác định chuỗi mẫu bản ghi trong bản ghi bằng TSQL?