U kunt de OBJECTPROPERTY()
. gebruiken functie in SQL Server om te controleren of een tabel al dan niet een tijdstempel . heeft kolom.
Om dit te doen, geeft u de object-ID van de tabel door als het eerste argument en TableHasTimestamp
als tweede argument. De functie retourneert een 1
of een 0
afhankelijk van het al dan niet hebben van een tijdstempel kolom.
Een retourwaarde van 1
betekent dat de tabel doet hebben een tijdstempel kolom en een waarde van 0
betekent dat niet.
Dit werkt ook voor kolommen die zijn gedefinieerd als rowversion (tijdstempel is het verouderde synoniem voor rowversion ).
Voorbeeld 1 – Een tijdstempelkolom
Hier is een snel voorbeeld om te demonstreren op een tafel met een tijdstempel kolom.
USE Test_timestamp; SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultaat:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
In dit geval is de Test_timestamp database heeft een tabel met de opgegeven ID, en het heeft een tijdstempel kolom.
Ik gebruik de OBJECT_ID()
functie om de ID van de tabel op te halen op basis van de naam.
Voorbeeld 2 – Een kolom met rijversie
Zoals gezegd werkt deze methode ook als je rowversion . hebt gebruikt om de kolom te definiëren.
Als ik bijvoorbeeld een tabel als volgt maak:
CREATE TABLE Owner ( OwnerId int PRIMARY KEY, OwnerName varchar(255), RowVersion rowversion );
En voer dan een controle uit:
SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultaat:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
Ik merk dat, hoewel in de documentatie van Microsoft staat dat tijdstempel is het synoniem van rowversion , op het moment van schrijven, een kolom maken als rowversion op mijn SQL Server 2017-systeem wordt het weergegeven als een tijdstempel kolom. Als ik naar het type kijk nadat de kolom is gemaakt, wordt het weergegeven als een tijdstempelkolom.
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';
Resultaat:
+---------+------------+-----------+ | Table | Column | Type | |---------+------------+-----------| | Owner | OwnerId | int | | Owner | OwnerName | varchar | | Owner | RowVersion | timestamp | +---------+------------+-----------+
Voorbeeld 3 – Tabellen zonder een TIMESTAMP-kolom
Dit is wat er gebeurt als de tafel geen tijdstempel heeft kolom.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultaat:
+---------------------+ | TableHasTimestamp | |---------------------| | 0 | +---------------------+
In dit geval is het object een tabel maar heeft het geen tijdstempel kolom.
Voorbeeld 4 – Wanneer het object geen tafel is
Dit is wat er gebeurt als de database wel een object met de ID bevat, maar dat object is niet eens een tabel.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultaat:
+---------------------+ | TableHasTimestamp | |---------------------| | NULL | +---------------------+
Voorbeeld 5 – Object bestaat niet
SQL Server gaat ervan uit dat de object-ID zich in de huidige databasecontext bevindt. Als u een object-ID uit een andere database doorgeeft, krijgt u ofwel een NULL-resultaat of krijgt u onjuiste resultaten.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];
Resultaat:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
In dit geval bevat de database geen objecten met die naam of ID, en dus krijg ik een NULL-resultaat.
Je krijgt ook NULL bij een fout of als je geen toestemming hebt om het object te bekijken.