Sie können die OBJECTPROPERTY()
verwenden Funktion in SQL Server, um zu prüfen, ob eine Tabelle einen Zeitstempel hat oder nicht Säule.
Übergeben Sie dazu als erstes Argument die Objekt-ID der Tabelle und TableHasTimestamp
als zweites Argument. Die Funktion gibt eine 1
zurück oder eine 0
abhängig davon, ob es einen Zeitstempel hat oder nicht Spalte.
Ein Rückgabewert von 1
bedeutet, dass die Tabelle tut haben einen Zeitstempel Spalte und einen Wert von 0
bedeutet, dass dies nicht der Fall ist.
Dies funktioniert auch für Spalten, die als rowversion definiert wurden (Zeitstempel ist das veraltete Synonym für rowversion ).
Beispiel 1 – Eine Zeitstempelspalte
Hier ist ein kurzes Beispiel für eine Tabelle mit einem Zeitstempel Spalte.
USE Test_timestamp; SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];
Ergebnis:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
In diesem Fall der Test_timestamp Die Datenbank hat eine Tabelle mit der bereitgestellten ID und einen Zeitstempel Spalte.
Ich verwende die OBJECT_ID()
Funktion, um die ID der Tabelle basierend auf ihrem Namen abzurufen.
Beispiel 2 – Eine Rowversion-Spalte
Wie bereits erwähnt, funktioniert diese Methode auch, wenn Sie rowversion verwendet haben um die Spalte zu definieren.
Zum Beispiel, wenn ich eine Tabelle wie folgt erstelle:
CREATE TABLE Owner ( OwnerId int PRIMARY KEY, OwnerName varchar(255), RowVersion rowversion );
Und führen Sie dann eine Überprüfung durch:
SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];
Ergebnis:
+---------------------+ | TableHasTimestamp | |---------------------| | 1 | +---------------------+
Das ist mir aufgefallen, obwohl in der Microsoft-Dokumentation dieser Zeitstempel angegeben ist ist das Synonym von rowversion , während ich dies schreibe, eine Spalte als rowversion erstellen auf meinem SQL Server 2017-System erscheint es tatsächlich als Zeitstempel Säule. Wenn ich mir den Typ ansehe, nachdem die Spalte erstellt wurde, wird er als Zeitstempelspalte angezeigt.
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';
Ergebnis:
+---------+------------+-----------+ | Table | Column | Type | |---------+------------+-----------| | Owner | OwnerId | int | | Owner | OwnerName | varchar | | Owner | RowVersion | timestamp | +---------+------------+-----------+
Beispiel 3 – Tabellen ohne TIMESTAMP-Spalte
Folgendes passiert, wenn die Tabelle keinen Zeitstempel hat Spalte.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];
Ergebnis:
+---------------------+ | TableHasTimestamp | |---------------------| | 0 | +---------------------+
In diesem Fall ist das Objekt eine Tabelle, aber es hat keinen Zeitstempel Spalte.
Beispiel 4 – Wenn das Objekt kein Tisch ist
Folgendes passiert, wenn die Datenbank ein Objekt mit der ID enthält, dieses Objekt jedoch nicht einmal eine Tabelle ist.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];
Ergebnis:
+---------------------+ | TableHasTimestamp | |---------------------| | NULL | +---------------------+
Beispiel 5 – Objekt existiert nicht
SQL Server geht davon aus, dass sich die Objekt-ID im aktuellen Datenbankkontext befindet. Wenn Sie eine Objekt-ID aus einer anderen Datenbank übergeben, erhalten Sie entweder ein NULL-Ergebnis oder falsche Ergebnisse.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];
Ergebnis:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
In diesem Fall enthält die Datenbank keine Objekte mit diesem Namen oder dieser ID, und daher erhalte ich ein NULL-Ergebnis.
Sie erhalten auch NULL bei einem Fehler oder wenn Sie keine Berechtigung zum Anzeigen des Objekts haben.