Bạn có thể sử dụng OBJECTPROPERTY()
trong SQL Server để kiểm tra xem bảng có dấu thời gian hay không cột.
Để thực hiện việc này, hãy chuyển ID đối tượng của bảng làm đối số đầu tiên và TableHasTimestamp
như đối số thứ hai. Hàm trả về 1
hoặc 0
tùy thuộc vào việc nó có dấu thời gian hay không cột.
Giá trị trả về 1
có nghĩa là bảng hiện có dấu thời gian và giá trị 0
nghĩa là không.
Điều này cũng hoạt động đối với các cột đã được xác định là đảo hàng ( dấu thời gian là từ đồng nghĩa không dùng nữa của rowversion ).
Ví dụ 1 - Cột dấu thời gian
Dưới đây là một ví dụ nhanh để minh họa trên bàn có dấu thời gian cột.
USE Test_timestamp; SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];
Kết quả:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
Trong trường hợp này, Test_timestamp cơ sở dữ liệu có một bảng với ID được cung cấp và nó có dấu thời gian cột.
Tôi sử dụng OBJECT_ID()
để truy xuất ID của bảng dựa trên tên của nó.
Ví dụ 2 - Cột chuyển đổi hàng
Như đã đề cập, phương pháp này cũng hoạt động nếu bạn đã sử dụng chuyển đổi hàng hóa để xác định cột.
Ví dụ:nếu tôi tạo một bảng như sau:
CREATE TABLE Owner ( OwnerId int PRIMARY KEY, OwnerName varchar(255), RowVersion rowversion );
Và sau đó chạy kiểm tra nó:
SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];
Kết quả:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
Tôi nhận thấy rằng, mặc dù tài liệu của Microsoft nói rằng dấu thời gian là từ đồng nghĩa của rowversion , kể từ khi viết bài này, việc tạo một cột dưới dạng rowversion trên hệ thống SQL Server 2017 của tôi thực sự làm cho nó xuất hiện dưới dạng dấu thời gian cột. Nếu tôi xem loại sau khi cột đã được tạo, nó được hiển thị dưới dạng cột dấu thời gian.
SELECT OBJECT_NAME(object_id) AS [Table], name AS [Column], TYPE_NAME(system_type_id) AS [Type] FROM sys.columns WHERE OBJECT_NAME(object_id) = 'Owner';
Kết quả:
+---------+------------+-----------+ | Table | Column | Type | |---------+------------+-----------| | Owner | OwnerId | int | | Owner | OwnerName | varchar | | Owner | RowVersion | timestamp | +---------+------------+-----------+
Ví dụ 3 - Các bảng không có cột TIMESTAMP
Đây là điều xảy ra khi bảng không có dấu thời gian cột.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];
Kết quả:
+---------------------+ | TableHasTimestamp | |---------------------| | 0 | +---------------------+
Trong trường hợp này, đối tượng là một bảng nhưng nó không có dấu thời gian cột.
Ví dụ 4 - Khi Đối tượng không phải là Bảng
Đây là những gì sẽ xảy ra khi cơ sở dữ liệu chứa một đối tượng có ID, nhưng đối tượng đó thậm chí không phải là một bảng.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];
Kết quả:
+---------------------+ | TableHasTimestamp | |---------------------| | NULL | +---------------------+
Ví dụ 5 - Đối tượng không tồn tại
SQL Server giả định rằng ID đối tượng nằm trong ngữ cảnh cơ sở dữ liệu hiện tại. Nếu bạn chuyển một ID đối tượng từ một cơ sở dữ liệu khác, bạn sẽ nhận được kết quả NULL hoặc bạn sẽ nhận được kết quả không chính xác.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];
Kết quả:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
Trong trường hợp này, cơ sở dữ liệu không chứa các đối tượng có tên hoặc ID đó, vì vậy tôi nhận được kết quả NULL.
Bạn cũng sẽ nhận được NULL do lỗi hoặc nếu bạn không có quyền xem đối tượng.