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

Utilizzare OBJECTPROPERTY() per scoprire se una tabella è una tabella di sistema in SQL Server

Il OBJECTPROPERTY() La funzione in SQL Server consente di controllare un oggetto per una proprietà specifica.

È possibile utilizzare questa funzione per verificare se un oggetto è una tabella di sistema o meno. Per fare ciò, passa l'ID oggetto come primo argomento e IsSystemTable come secondo argomento. La funzione restituisce un 1 o un 0 a seconda che si tratti o meno di una tabella di sistema (1 significa che è una tabella di sistema e 0 significa che non lo è).

Esempio 1 – Utilizzo di base

Ecco un rapido esempio da dimostrare.

SELECT OBJECTPROPERTY(3, 'IsSystemTable') AS [IsSystemTable];

Risultato:

+-----------------+
| IsSystemTable   |
|-----------------|
| 1               |
+-----------------+

In questo caso, l'oggetto è una tabella di sistema.

Esempio 2 – L'oggetto NON è una tabella di sistema

Ecco cosa succede quando l'oggetto non è una tabella di sistema.

SELECT OBJECTPROPERTY(1013578649, 'IsSystemTable') AS [IsSystemTable];

Risultato:

+-----------------+
| IsSystemTable   |
|-----------------|
| 0               |
+-----------------+

In questo caso, il database fa in effetti ho un oggetto con quell'ID, ma l'oggetto è in realtà una tabella definita dall'utente, quindi ottengo un risultato negativo.

Eccolo di nuovo usando OBJECT_ID() per ottenere l'ID dal nome dell'oggetto.

SELECT 
  OBJECT_ID('Dimension.City') AS [Object ID],
  OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsSystemTable') AS [IsSystemTable],
  OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];

Risultato:

+-------------+-----------------+---------------+
| Object ID   | IsSystemTable   | IsUserTable   |
|-------------+-----------------+---------------|
| 1013578649  | 0               | 1             |
+-------------+-----------------+---------------+

Ho anche verificato se l'oggetto è una tabella definita dall'utente e il risultato è positivo.

Esempio 3 – 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'), 'IsSystemTable') AS [InvalidObject],
  OBJECTPROPERTY(12345678, 'IsSystemTable') 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.