Puede usar OBJECTPROPERTY()
función en SQL Server para verificar si un objeto es una tabla definida por el usuario o no.
Para hacer esto, pase el ID del objeto como primer argumento y IsUserTable
como segundo argumento. La función devuelve un 1
o un 0
dependiendo de si es o no una tabla definida por el usuario.
Un valor de retorno de 1
significa que es una tabla definida por el usuario y un valor de 0
significa que no lo es.
Ejemplo 1:uso básico
Aquí hay un ejemplo rápido para demostrarlo.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(1013578649, 'IsUserTable') AS [IsUserTable];
Resultado:
+---------------+ | IsUserTable | |---------------| | 1 | +---------------+
En este caso, el WideWorldImportersDW la base de datos tiene un objeto con el ID proporcionado y es una tabla definida por el usuario.
Ejemplo 2:obtener el ID del objeto
Si conoce el nombre del objeto, pero no su ID, puede usar el OBJECT_ID()
función para recuperar el ID basado en su nombre.
Ejemplo:
SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];
Resultado:
+---------------+ | IsUserTable | |---------------| | 1 | +---------------+
Este es el mismo objeto del ejemplo anterior.
Aquí está de nuevo con la salida de ID por separado.
SELECT OBJECT_ID('Dimension.City') AS [Object ID], OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') AS [IsUserTable];
Resultado:
+-------------+---------------+ | Object ID | IsUserTable | |-------------+---------------| | 1013578649 | 1 | +-------------+---------------+
Ejemplo 3:cuando el objeto NO es una tabla definida por el usuario
Esto es lo que sucede cuando el objeto no es una tabla de usuario.
SELECT OBJECTPROPERTY(402100473, 'IsUserTable') AS [IsUserTable];
Resultado:
+---------------+ | IsUserTable | |---------------| | 0 | +---------------+
En este caso, la base de datos sí tengo un objeto con esa ID, pero el objeto es en realidad un procedimiento almacenado (no una tabla definida por el usuario), por lo que obtengo un resultado negativo.
Aquí está nuevamente 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:
+-------------+---------------+---------------+ | Object ID | IsUserTable | IsProcedure | |-------------+---------------+---------------| | 402100473 | 0 | 1 | +-------------+---------------+---------------+
También verifiqué si el objeto es un procedimiento almacenado y el resultado es positivo.
Ejemplo 4:el objeto no existe
SQL Server asume que el ID del objeto está en el contexto de la base de datos actual. Si pasa un ID de objeto de una base de datos diferente, obtendrá un resultado NULO o obtendrá resultados incorrectos.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'IsUserTable') AS [InvalidObject], OBJECTPROPERTY(12345678, 'IsUserTable') AS [12345678];
Resultado:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
En este caso, la base de datos no contiene objetos con ese nombre o ID, por lo que obtengo un resultado NULL.
También obtendrá NULL en caso de error o si no tiene permiso para ver el objeto.