Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Use OBJECTPROPERTY() para descobrir se uma tabela é uma tabela de sistema no SQL Server


A OBJECTPROPERTY() função no SQL Server permite que você verifique um objeto para uma propriedade específica.

Você pode usar esta função para verificar se um objeto é uma tabela do sistema ou não. Para fazer isso, passe o ID do objeto como o primeiro argumento e IsSystemTable como segundo argumento. A função retorna um 1 ou um 0 dependendo se é ou não uma tabela de sistema (1 significa que é uma tabela de sistema e 0 significa que não).


Exemplo 1 – Uso básico


Aqui está um exemplo rápido para demonstrar.
SELECT OBJECTPROPERTY(3, 'IsSystemTable') AS [IsSystemTable];

Resultado:
+-----------------+
| IsSystemTable   |
|-----------------|
| 1               |
+-----------------+

Nesse caso, o objeto é uma tabela de sistema.

Exemplo 2 – Objeto NÃO é uma Tabela de Sistema


Aqui está o que acontece quando o objeto não é uma tabela de sistema.
SELECT OBJECTPROPERTY(1013578649, 'IsSystemTable') AS [IsSystemTable];

Resultado:
+-----------------+
| IsSystemTable   |
|-----------------|
| 0               |
+-----------------+

Nesse caso, o banco de dados não na verdade tenho um objeto com esse ID, mas o objeto é na verdade uma tabela definida pelo usuário, então recebo um resultado negativo.

Aqui está novamente usando OBJECT_ID() para obter o ID do nome do objeto.
SELECT 
  OBJECT_ID('Dimension.City') AS [Object ID],
  OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsSystemTable') AS [IsSystemTable],
  OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];

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

Também verifiquei se o objeto é uma tabela definida pelo usuário e o resultado é positivo.

Exemplo 3 – O objeto não existe


O SQL Server assume que a identificação do objeto está no contexto do banco de dados atual. Se você passar um ID de objeto de um banco de dados diferente, obterá um resultado NULL ou obterá resultados incorretos.
SELECT 
  OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'IsSystemTable') AS [InvalidObject],
  OBJECTPROPERTY(12345678, 'IsSystemTable') AS [12345678];

Resultado:
+-----------------+------------+
| InvalidObject   | 12345678   |
|-----------------+------------|
| NULL            | NULL       |
+-----------------+------------+

Nesse caso, o banco de dados não contém objetos com esse nome ou ID e, portanto, obtenho um resultado NULL.

Você também receberá NULL em caso de erro ou se não tiver permissão para visualizar o objeto.