Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Überprüfen Sie, ob eine Tabelle eine TIMESTAMP-Spalte in SQL Server mit OBJECTPROPERTY() hat

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.