sql >> Databasteknik >  >> RDS >> Sqlserver

Kontrollera om en tabell har en TIMESTAMP-kolumn i SQL Server med OBJECTPROPERTY()

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.


  1. Motsvarar LIMIT och OFFSET för SQL Server?

  2. Fix "Kan inte installera i Homebrew på ARM-processor i Intels standardprefix (/usr/local)!"

  3. SQL LocalDB vs SQL Server CE

  4. Vad är DBMS? – En omfattande guide till databashanteringssystem