Możesz użyć OBJECTPROPERTY()
funkcja w SQL Server, aby sprawdzić, czy tabela ma sygnaturę czasową kolumna.
Aby to zrobić, przekaż identyfikator obiektu tabeli jako pierwszy argument, a TableHasTimestamp
jako drugi argument. Funkcja zwraca 1
lub 0
w zależności od tego, czy ma sygnaturę czasową, czy nie kolumna.
Zwracana wartość 1
oznacza, że tabela działa mieć sygnaturę czasową kolumna i wartość 0
oznacza, że nie.
Działa to również w przypadku kolumn, które zostały zdefiniowane jako rowversion (sygnatura czasowa jest przestarzałym synonimem rowversion ).
Przykład 1 – Kolumna sygnatury czasowej
Oto krótki przykład do zademonstrowania na stole z sygnaturą czasową kolumna.
USE Test_timestamp; SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];
Wynik:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
W tym przypadku Test_timestamp baza danych zawiera tabelę z podanym identyfikatorem i ma sygnaturę czasową kolumna.
Używam OBJECT_ID()
funkcja do pobrania identyfikatora tabeli na podstawie jej nazwy.
Przykład 2 – Kolumna rowversion
Jak wspomniano, ta metoda działa również, jeśli użyłeś rowversion aby zdefiniować kolumnę.
Na przykład, jeśli utworzę tabelę w następujący sposób:
CREATE TABLE Owner ( OwnerId int PRIMARY KEY, OwnerName varchar(255), RowVersion rowversion );
A następnie sprawdź to:
SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];
Wynik:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
Zauważyłem to, chociaż dokumentacja Microsoftu stwierdza, że sygnatura czasowa jest synonimem rowversion , w chwili pisania tego tekstu, tworzenie kolumny jako rowversion w moim systemie SQL Server 2017 faktycznie wyświetla się jako sygnatura czasowa kolumna. Jeśli spojrzę na typ po utworzeniu kolumny, jest on wyświetlany jako kolumna sygnatury czasowej.
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';
Wynik:
+---------+------------+-----------+ | Table | Column | Type | |---------+------------+-----------| | Owner | OwnerId | int | | Owner | OwnerName | varchar | | Owner | RowVersion | timestamp | +---------+------------+-----------+
Przykład 3 – Tabele bez kolumny TIMESTAMP
Oto, co się dzieje, gdy tabela nie ma sygnatury czasowej kolumna.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];
Wynik:
+---------------------+ | TableHasTimestamp | |---------------------| | 0 | +---------------------+
W tym przypadku obiektem jest tabela, ale nie ma sygnatury czasowej kolumna.
Przykład 4 – Kiedy obiekt nie jest tabelą
Oto, co się dzieje, gdy baza danych zawiera obiekt z identyfikatorem, ale ten obiekt nie jest nawet tabelą.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];
Wynik:
+---------------------+ | TableHasTimestamp | |---------------------| | NULL | +---------------------+
Przykład 5 – Obiekt nie istnieje
SQL Server zakłada, że identyfikator obiektu znajduje się w bieżącym kontekście bazy danych. Jeśli przekażesz identyfikator obiektu z innej bazy danych, otrzymasz wynik NULL lub otrzymasz nieprawidłowe wyniki.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];
Wynik:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
W tym przypadku baza danych nie zawiera obiektów o tej nazwie lub identyfikatorze, więc otrzymuję wynik NULL.
Otrzymasz również NULL w przypadku błędu lub jeśli nie masz uprawnień do przeglądania obiektu.