sql >> Base de Datos >  >> RDS >> Sqlserver

6 formas de comprobar si existe una tabla en SQL Server (ejemplos de T-SQL)

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