sql >> Database teknologi >  >> RDS >> Sqlserver

Tjek, om en tabel har en TIMESTAMP-kolonne i SQL Server med OBJECTPROPERTY()

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.


  1. Sådan skriver du en forespørgsel med flere adfærd

  2. DEGREES() Eksempler i SQL Server

  3. Hent beskeder fra postkassen ved hjælp af PL/SQL Mail_Client API

  4. Find ud af, hvilken partition en given værdi ville være knyttet til i SQL Server (T-SQL)