Du kan bruge OBJECTPROPERTY()
funktion i SQL Server for at kontrollere, om en tabel har et tidsstempel kolonne.
For at gøre dette skal du sende tabellens objekt-id som det første argument og TableHasTimestamp
som det andet argument. Funktionen returnerer en 1
eller en 0
afhængigt af, om den har et tidsstempel kolonne.
En returværdi på 1
betyder, at tabellen gør have et tidsstempel kolonne og en værdi på 0
betyder det ikke.
Dette virker også for kolonner, der er blevet defineret som rowversion (tidsstempel er det forældede synonym for rowversion ).
Eksempel 1 – En tidsstempelkolonne
Her er et hurtigt eksempel til at demonstrere på en tabel med et tidsstempel kolonne.
USE Test_timestamp; SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultat:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
I dette tilfælde er Test_timesamp databasen har en tabel med det angivne id, og den har et tidsstempel kolonne.
Jeg bruger OBJECT_ID()
funktion til at hente tabellens ID baseret på dets navn.
Eksempel 2 – En rækkeversionskolonne
Som nævnt virker denne metode også, hvis du har brugt rowversion for at definere kolonnen.
For eksempel, hvis jeg opretter en tabel som følger:
CREATE TABLE Owner ( OwnerId int PRIMARY KEY, OwnerName varchar(255), RowVersion rowversion );
Og kør derefter et tjek på det:
SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultat:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
Det bemærker jeg, selvom Microsofts dokumentation angiver det tidsstempel er synonymet for rowversion , når dette skrives, opretter du en kolonne som rowversion på mit SQL Server 2017-system får det faktisk til at fremstå som et tidsstempel kolonne. Hvis jeg ser på typen, efter at kolonnen er blevet oprettet, vises den som en tidsstempelkolonne.
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 | +---------+------------+-----------+
Eksempel 3 – Tabeller uden en TIMESTAMP-kolonne
Her er, hvad der sker, når tabellen ikke har et tidsstempel kolonne.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultat:
+---------------------+ | TableHasTimestamp | |---------------------| | 0 | +---------------------+
I dette tilfælde er objektet en tabel, men det har ikke et tidsstempel kolonne.
Eksempel 4 – Når objektet ikke er en tabel
Her er, hvad der sker, når databasen indeholder et objekt med ID'et, men det objekt er ikke engang en tabel.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];
Resultat:
+---------------------+ | TableHasTimestamp | |---------------------| | NULL | +---------------------+
Eksempel 5 – Objekt eksisterer ikke
SQL Server antager, at objekt-id'et er i den aktuelle databasekontekst. Hvis du sender et objekt-id fra en anden database, får du enten et NULL-resultat, eller du får forkerte resultater.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];
Resultat:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
I dette tilfælde indeholder databasen ingen objekter med det navn eller ID, og så får jeg et NULL resultat.
Du får også NULL ved fejl, eller hvis du ikke har tilladelse til at se objektet.