sql >> Databáze >  >> RDS >> Sqlserver

Zkontrolujte, zda tabulka obsahuje sloupec TIMESTAMP na serveru SQL pomocí OBJECTPROPERTY()

Můžete použít OBJECTPROPERTY() funkce na serveru SQL Server a zkontroluje, zda má tabulka časové razítko sloupec.

Chcete-li to provést, předejte ID objektu tabulky jako první argument a TableHasTimestamp jako druhý argument. Funkce vrací 1 nebo 0 podle toho, zda má či nemá časové razítko sloupec.

Vrácená hodnota 1 znamená, že tabulka dělá mít časové razítko a hodnotu 0 znamená, že ne.

Toto funguje také pro sloupce, které byly definovány jako rowversion (časové razítko je zastaralé synonymum pro rowversion ).

Příklad 1 – Sloupec časového razítka

Zde je rychlý příklad k demonstraci na stole s časovým razítkem sloupec.

USE Test_timestamp;
SELECT OBJECTPROPERTY(OBJECT_ID('Pet'), 'TableHasTimestamp') AS [TableHasTimestamp];

Výsledek:

+---------------------+
| TableHasTimestamp   |
|---------------------|
| 1                   |
+---------------------+

V tomto případě Test_timestamp databáze má tabulku s poskytnutým ID a má časové razítko sloupec.

Používám OBJECT_ID() funkce pro načtení ID tabulky na základě jejího názvu.

Příklad 2 – Sloupec verze řádku

Jak již bylo zmíněno, tato metoda funguje také v případě, že jste použili rowversion k definování sloupce.

Pokud například vytvořím tabulku takto:

CREATE TABLE Owner (
  OwnerId int PRIMARY KEY, 
  OwnerName varchar(255), 
  RowVersion rowversion
  );

A pak na to spusťte kontrolu:

SELECT OBJECTPROPERTY(OBJECT_ID('Owner'), 'TableHasTimestamp') AS [TableHasTimestamp];

Výsledek:

+---------------------+
| TableHasTimestamp   |
|---------------------|
| 1                   |
+---------------------+

Všiml jsem si toho, ačkoli dokumentace společnosti Microsoft uvádí, že časové razítko je synonymem pro rowversion , v době psaní tohoto článku vytváří sloupec jako rowversion na mém systému SQL Server 2017 to skutečně vypadá jako časové razítko sloupec. Pokud se podívám na typ po vytvoření sloupce, zobrazí se jako sloupec s časovým razítkem.

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';

Výsledek:

+---------+------------+-----------+
| Table   | Column     | Type      |
|---------+------------+-----------|
| Owner   | OwnerId    | int       |
| Owner   | OwnerName  | varchar   |
| Owner   | RowVersion | timestamp |
+---------+------------+-----------+

Příklad 3 – Tabulky bez sloupce TIMESTAMP

Co se stane, když stůl nemá časové razítko sloupec.

USE WideWorldImportersDW;
SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasTimestamp') AS [TableHasTimestamp];

Výsledek:

+---------------------+
| TableHasTimestamp   |
|---------------------|
| 0                   |
+---------------------+

V tomto případě je objektem tabulka, ale nemá časové razítko sloupec.

Příklad 4 – Když objekt není tabulka

Co se stane, když databáze obsahuje objekt s ID, ale tento objekt není ani tabulka.

SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasTimestamp') AS [TableHasTimestamp];

Výsledek:

+---------------------+
| TableHasTimestamp   |
|---------------------|
| NULL                |
+---------------------+

Příklad 5 – Objekt neexistuje

SQL Server předpokládá, že ID objektu je v aktuálním kontextu databáze. Pokud předáte ID objektu z jiné databáze, dostanete buď výsledek NULL, nebo nesprávné výsledky.

SELECT 
  OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasTimestamp') AS [InvalidObject],
  OBJECTPROPERTY(12345678, 'TableHasTimestamp') AS [12345678];

Výsledek:

+-----------------+------------+
| InvalidObject   | 12345678   |
|-----------------+------------|
| NULL            | NULL       |
+-----------------+------------+

V tomto případě databáze neobsahuje žádné objekty tohoto jména nebo ID, takže dostanu výsledek NULL.

Při chybě nebo v případě, že nemáte oprávnění k zobrazení objektu, získáte také hodnotu NULL.


  1. CLR Strict Security na SQL Server 2017

  2. Ukládání souborů v databázi versus souborový systém

  3. Musíte deklarovat skalární proměnnou @Id?

  4. Zkontrolujte, zda v Oracle existuje tabulka