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

Verifica se una tabella ha una colonna TIMESTAMP in SQL Server con OBJECTPROPERTY()

Puoi usare OBJECTPROPERTY() funzione in SQL Server per verificare se una tabella ha un timestamp colonna.

Per fare ciò, passa l'ID oggetto della tabella come primo argomento e TableHasTimestamp come secondo argomento. La funzione restituisce un 1 o un 0 a seconda che abbia o meno un timestamp colonna.

Un valore restituito di 1 significa che la tabella fa avere un indicatore orario colonna e un valore di 0 significa che non è così.

Questo funziona anche per le colonne che sono state definite come rowversion (indicatore orario è il sinonimo deprecato di rowversion ).

Esempio 1:una colonna timestamp

Ecco un rapido esempio da dimostrare su una tabella con un timestamp colonna.

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

Risultato:

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

In questo caso, il Timestamp_test database ha una tabella con l'ID fornito e ha un timestamp colonna.

Uso il OBJECT_ID() funzione per recuperare l'ID della tabella in base al suo nome.

Esempio 2:una colonna rowversion

Come accennato, questo metodo funziona anche se hai utilizzato rowversion per definire la colonna.

Ad esempio, se creo una tabella come segue:

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

E poi esegui un controllo su di esso:

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

Risultato:

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

Lo noto, sebbene la documentazione di Microsoft indichi che timestamp è sinonimo di rowversion , nel momento in cui scrivo, creando una colonna come rowversion sul mio sistema SQL Server 2017 lo fa effettivamente apparire come un timestamp colonna. Se osservo il tipo dopo che la colonna è stata creata, viene visualizzata come una colonna timestamp.

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

Risultato:

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

Esempio 3 – Tabelle senza una colonna TIMESTAMP

Ecco cosa succede quando la tabella non ha un timestamp colonna.

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

Risultato:

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

In questo caso, l'oggetto è una tabella ma non ha un timestamp colonna.

Esempio 4 – Quando l'oggetto non è un tavolo

Ecco cosa succede quando il database contiene un oggetto con l'ID, ma quell'oggetto non è nemmeno una tabella.

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

Risultato:

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

Esempio 5 – L'oggetto non esiste

SQL Server presuppone che l'ID oggetto si trovi nel contesto del database corrente. Se passi un ID oggetto da un database diverso, otterrai un risultato NULL o otterrai risultati errati.

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

Risultato:

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

In questo caso il database non contiene oggetti con quel nome o ID, quindi ottengo un risultato NULL.

Otterrai anche NULL in caso di errore o se non disponi dell'autorizzazione per visualizzare l'oggetto.