Du kan använda OBJECTPROPERTY()
funktion i SQL Server för att kontrollera om en tabell har en tidsstämpel kolumn.
För att göra detta skickar du tabellens objekt-ID som det första argumentet och TableHasTimestamp
som det andra argumentet. Funktionen returnerar en 1
eller en 0
beroende på om den har en tidsstämpel eller inte kolumn.
Ett returvärde på 1
betyder att tabellen gör ha en tidsstämpel kolumn och värdet 0
betyder att det inte gör det.
Detta fungerar även för kolumner som har definierats som radversion (tidsstämpel är den föråldrade synonymen för rowversion ).
Exempel 1 – En tidsstämpelskolumn
Här är ett snabbt exempel att visa på ett bord med en tidsstämpel kolumn.
USE Test_timestamp; SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultat:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
I det här fallet, Test_timestamp databasen har en tabell med det angivna ID och den har en tidsstämpel kolumn.
Jag använder OBJECT_ID()
funktion för att hämta tabellens ID baserat på dess namn.
Exempel 2 – En radversionskolumn
Som nämnts fungerar den här metoden även om du har använt rowversion för att definiera kolumnen.
Till exempel, om jag skapar en tabell enligt följande:
CREATE TABLE Owner ( OwnerId int PRIMARY KEY, OwnerName varchar(255), RowVersion rowversion );
Och kör sedan en kontroll på det:
SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultat:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
Jag märker det, även om Microsofts dokumentation anger den tidsstämpeln är synonymen till rowversion , när detta skrivs, skapa en kolumn som rowversion på mitt SQL Server 2017-system får det faktiskt att visas som en tidsstämpel kolumn. Om jag tittar på typen efter att kolumnen har skapats, visas den som en tidsstämpelskolumn.
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';
Resultat:
+---------+------------+-----------+ | Table | Column | Type | |---------+------------+-----------| | Owner | OwnerId | int | | Owner | OwnerName | varchar | | Owner | RowVersion | timestamp | +---------+------------+-----------+
Exempel 3 – Tabeller utan en TIDSTÄMPEL-kolumn
Här är vad som händer när tabellen inte har en tidsstämpel kolumn.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultat:
+---------------------+ | TableHasTimestamp | |---------------------| | 0 | +---------------------+
I det här fallet är objektet en tabell men det har ingen tidsstämpel kolumn.
Exempel 4 – När objektet inte är en tabell
Här är vad som händer när databasen innehåller ett objekt med ID, men det objektet inte ens är en tabell.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultat:
+---------------------+ | TableHasTimestamp | |---------------------| | NULL | +---------------------+
Exempel 5 – Objekt existerar inte
SQL Server antar att objekt-ID:t finns i den aktuella databaskontexten. Om du skickar in ett objekt-ID från en annan databas får du antingen ett NULL-resultat eller så får du felaktiga resultat.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];
Resultat:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
I det här fallet innehåller databasen inga objekt med det namnet eller ID, så jag får ett NULL-resultat.
Du får också NULL vid fel eller om du inte har behörighet att visa objektet.