sql >> Database >  >> RDS >> Sqlserver

Controleer of een tabel een TIMESTAMP-kolom heeft in SQL Server met OBJECTPROPERTY()

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.


  1. Oracle-gegevensbronconfiguratie voor Spring

  2. Eén record verwijderen uit Entity Framework?

  3. SELECT max(x) retourneert null; hoe kan ik ervoor zorgen dat het 0 teruggeeft?

  4. SQL Server Error 110:Er zijn minder kolommen in de INSERT-instructie dan de waarden die zijn opgegeven in de VALUES-clausule.