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.