Можете да използвате OBJECTPROPERTY()
функция в SQL Server, за да провери дали дадена таблица има времево клеймо колона.
За да направите това, предайте идентификатора на обекта на таблицата като първи аргумент и TableHasTimestamp
като втори аргумент. Функцията връща 1
или 0
в зависимост от това дали има клеймо за време колона.
Връщана стойност на 1
означава, че таблицата прави имат клеймо за време колона и стойност 0
означава, че не.
Това работи и за колони, които са дефинирани като версия на ред (клеймо за време е отхвърленият синоним на версия на ред ).
Пример 1 – Колона с времева марка
Ето бърз пример за демонстрация на таблица с клеймо за време колона.
USE Test_timestamp; SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];
Резултат:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
В този случай Test_timestamp базата данни има таблица с предоставения идентификатор и има клеймо за време колона.
Използвам OBJECT_ID()
функция за извличане на идентификатора на таблицата въз основа на нейното име.
Пример 2 – Колона с версия на реда
Както споменахме, този метод работи и ако сте използвали версия на ред за да дефинирате колоната.
Например, ако създам таблица, както следва:
CREATE TABLE Owner ( OwnerId int PRIMARY KEY, OwnerName varchar(255), RowVersion rowversion );
След това го проверете:
SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];
Резултат:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
Забелязвам това, въпреки че в документацията на Microsoft е посочено това timestamp е синоним на версия на ред , към момента на писане, създаване на колона като версия на ред на моята SQL Server 2017 система всъщност го показва като времево клеймо колона. Ако погледна типа след създаването на колоната, той се показва като колона с времеви печат.
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';
Резултат:
+---------+------------+-----------+ | Table | Column | Type | |---------+------------+-----------| | Owner | OwnerId | int | | Owner | OwnerName | varchar | | Owner | RowVersion | timestamp | +---------+------------+-----------+
Пример 3 – Таблици без колона TIMESTAMP
Ето какво се случва, когато таблицата няма клеймо за време колона.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];
Резултат:
+---------------------+ | TableHasTimestamp | |---------------------| | 0 | +---------------------+
В този случай обектът е таблица, но няма клеймо за време колона.
Пример 4 – Когато обектът не е таблица
Ето какво се случва, когато базата данни съдържа обект с идентификатор, но този обект дори не е таблица.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];
Резултат:
+---------------------+ | TableHasTimestamp | |---------------------| | NULL | +---------------------+
Пример 5 – Обектът не съществува
SQL Server приема, че идентификаторът на обекта е в текущия контекст на базата данни. Ако подадете идентификатор на обект от друга база данни, или ще получите резултат NULL, или ще получите неправилни резултати.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];
Резултат:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
В този случай базата данни не съдържа обекти с това име или ID и така получавам резултат NULL.
Освен това ще получите NULL при грешка или ако нямате разрешение да видите обекта.