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

Descubra se um objeto é uma tabela definida pelo usuário no SQL Server com OBJECTPROPERTY()


Você pode usar o OBJECTPROPERTY() função no SQL Server para verificar se um objeto é uma tabela definida pelo usuário ou não.

Para fazer isso, passe o ID do objeto como o primeiro argumento e IsUserTable como segundo argumento. A função retorna um 1 ou um 0 dependendo se é ou não uma tabela definida pelo usuário.

Um valor de retorno de 1 significa que é uma tabela definida pelo usuário e um valor de 0 significa que não é.


Exemplo 1 – Uso básico


Aqui está um exemplo rápido para demonstrar.
USE WideWorldImportersDW;SELECT OBJECTPROPERTY(1013578649, 'IsUserTable') AS [IsUserTable];

Resultado:
+---------------+| IsUserTable ||---------------|| 1 |+---------------+

Nesse caso, o WideWorldImportersDW banco de dados tem um objeto com o ID fornecido e é uma tabela definida pelo usuário.

Exemplo 2 – Obtendo o ID do objeto


Se você sabe o nome do objeto, mas não seu ID, você pode usar o OBJECT_ID() função para recuperar o ID com base em seu nome.

Exemplo:
SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];

Resultado:
+---------------+| IsUserTable ||---------------|| 1 |+---------------+

Este é o mesmo objeto do exemplo anterior.

Aqui está novamente com a saída de ID separadamente.
SELECT OBJECT_ID('Dimension.City') AS [Object ID], OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];

Resultado:
+-------------+---------------+| ID do objeto | IsUserTable ||-------------+---------------|| 1013578649 | 1 |+-------------+---------------+

Exemplo 3 – Quando o Objeto NÃO é uma Tabela Definida pelo Usuário


Aqui está o que acontece quando o objeto não é uma tabela de usuário.
SELECT OBJECTPROPERTY(402100473, 'IsUserTable') AS [IsUserTable];

Resultado:
+---------------+| IsUserTable ||---------------|| 0 |+---------------+

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

Aqui está novamente usando OBJECT_ID() .
SELECT OBJECT_ID('Sequences.ReseedAllSequences') AS [Object ID], OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'IsUserTable') AS [IsUserTable], OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), ' IsProcedure') AS [IsProcedure];

Resultado:
+-------------+---------------+---------------+ | ID do objeto | IsUserTable | IsProcedure ||-------------+---------------+---------------|| 402100473 | 0 | 1 |+-------------+---------------+---------------+ 
Também verifiquei se o objeto é um procedimento armazenado e o resultado é positivo.

Exemplo 4 – Objeto não existe


O SQL Server pressupõe 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'), 'IsUserTable') AS [InvalidObject], OBJECTPROPERTY(12345678, 'IsUserTable') AS [12345678];

Resultado:
+-----------------+------------+| Objeto inválido | 12345678 ||-----------------+------------|| NULO | 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.