Este artículo ofrece cinco opciones para comprobar si existe una tabla en SQL Server. La mayoría de las opciones implican consultar una vista del sistema, pero una de las opciones ejecuta un procedimiento almacenado del sistema y otra implica una función.
También incluyo algunos IF
simples declaraciones que se pueden modificar para adaptarse a sus circunstancias.
Opción 1:la vista sys.tables
Esta opción consulta el sys.tables
vista del catálogo del sistema. Esta vista devuelve una fila para cada tabla de usuario. Por lo tanto, puede consultarlo usando el nombre de la tabla que está buscando.
Ejemplo:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
También puede agregar el nombre del esquema a las cosas que está comprobando. Aquí se explica cómo modificar la consulta anterior para incluir el nombre del esquema:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Tenga en cuenta que sys.tables
view solo devuelve el ID del esquema, así que tuve que pasarlo a SCHEMA_NAME()
función para obtener su nombre. Alternativamente, podría haber usado el ID del esquema si lo hubiera sabido.
Ejemplo:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Opción 2:el procedimiento almacenado sp_tables
La siguiente opción ejecuta sp_tables
procedimiento almacenado.
Así es como su código puede ser sucinto al usar este método:
sp_tables 'Artists'
Resultado:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Sin embargo, este procedimiento almacenado devuelve vistas y tablas, por lo que es una buena idea reducirlo a solo tablas (a menos que también esté interesado en que le devuelvan las vistas). Para restringirlo a solo tablas, use @table_type = "'TABLE'"
.
Mientras lo hace, también puede especificar el propietario de la tabla y el calificador de la tabla.
Ejemplo:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Resultado:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Es importante tener en cuenta que @table_type
El parámetro acepta una lista separada por comas. Por lo tanto, es un poco diferente a los otros parámetros. El @table_type
el valor debe estar entre comillas dobles y cada elemento entre comillas simples. En mi ejemplo, solo hay un elemento de la lista, sin embargo, aún debe estar entre comillas dobles y simples.
Opción 3:INFORMACIÓN_ESQUEMA.TABLAS
El INFORMATION_SCHEMA.TABLES
system view devuelve una fila para cada tabla o vista en la base de datos actual para la que el usuario actual tiene permisos. Es similar a sys.tables
, pero devuelve menos columnas. Las vistas del esquema de información incluidas en SQL Server cumplen con la definición estándar ISO para INFORMACION_ESQUEMA.
Aquí hay un ejemplo de cómo usarlo para verificar si existe una tabla en la base de datos actual:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Resultado:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Aquí está de nuevo, pero esta vez también especifico el esquema:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Resultado:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Opción 4:la función OBJECT_ID()
También puede usar una función como OBJECT_ID()
para ver si devuelve un valor no NULL.
Ejemplo:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Resultado:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
En este caso, la tabla existe. Tenga en cuenta que usé U
para indicar el tipo de objeto (tabla definida por el usuario).
También puede proporcionar un nombre de tres partes para incluir la base de datos y el esquema:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Resultado:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Si la tabla no existe, obtendrá NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Resultado:
+----------+ | Result | |----------| | NULL | +----------+
Vea a continuación un ejemplo del uso de esto en un IF
declaración.
Opción 5:la vista sys.objects
Como si ninguno de los ejemplos anteriores hiciera el trabajo, aquí hay otra forma de verificar si existe una tabla.
Esta vez consulto el sys.objects
vista del catálogo del sistema. Esta vista devuelve una fila para cada objeto de ámbito de esquema definido por el usuario en la base de datos. No solo devuelve tablas, devuelve todo tipo de objetos. Por lo tanto, debemos reducirlo a solo tablas. En este caso, solo me interesan las tablas definidas por el usuario, por lo que puedo usar type = 'U'
(U
es para "USER_TABLE"). Alternativamente, podría usar TYPE_DESC = 'USER_TABLE'
.
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Aquí está de nuevo, pero especificando el esquema:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Resultado:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Opción 6:la vista sys.sysobjects (EVITAR)
Esta opción solo aparece en la lista para que pueda recomendar su uso. Los sys.sysobjects
La vista se incluye en SQL Server para compatibilidad con versiones anteriores, y Microsoft recomienda que evite usar esta vista en trabajos futuros.
Si encuentra código que usa esta vista, considere modificarlo para usar sys.objects
o alguna otra vista del sistema o procedimiento almacenado.
En cualquier caso, así es como se vería el ejemplo anterior si se usa sys.sysobjects
en lugar de sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Resultado:
+-----------+ | id | |-----------| | 885578193 | +-----------+
Declaración SI 1
Aquí hay un IF
simple declaración que verifica la existencia de la tabla, luego imprime un mensaje diferente según el resultado. Este código puede modificarse para adaptarse a sus necesidades específicas.
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultado:
The table exists
Y así es como se ve cuando la tabla no existe:
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultado:
The table does not exist
Declaración SI 2
Aquí hay otro IF
declaración que se puede modificar para satisfacer sus necesidades específicas.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Resultado:
The table exists