Este artículo recorre las diferentes versiones de la sentencia T-SQL IF EXISTS para la base de datos SQL utilizando varios ejemplos.
- IF EXISTS en SQL 2014 o anterior
- DROP ..IF EXISTS en SQL Server 2016 a SQL Server 2019
Introducción
Supongamos que desea implementar objetos como tablas, procedimientos, funciones en la base de datos de SQL Server. Si ejecuta las sentencias CREATE para estos objetos, y ese objeto ya existe en una base de datos, obtendrá el mensaje 2714, nivel 16, estado 3 de error como se muestra a continuación.
Puede escribir una sentencia DROP antes de ejecutar la sentencia create. Funciona bien si el objeto existe en la base de datos.
En caso de que el objeto no exista, y se intente hacer un drop, se obtiene el siguiente error.
Para evitar esta situación, por lo general, los desarrolladores añaden la sentencia T-SQL If Exists y sueltan el objeto si ya está disponible en la base de datos.
Digamos que deseamos desplegar un procedimiento almacenado ‘stpGetAllMembers’ en la base de datos de prueba de SQLShack. Podemos utilizar varios métodos para comprobar si el procedimiento existe en la base de datos SQL, pero vamos a consultar la tabla del sistema sys.objects para ello.
El siguiente código hace lo siguiente por nosotros:
- Primero, ejecuta la sentencia select dentro del IF Exists
- Si la sentencia select devuelve un valor que la condición es TRUE para IF Exists
- Inicia el código dentro de una sentencia begin e imprime el mensaje
- Deja caer el objeto si ya existe en la base de datos SQL
- También podemos usarlo para dejar caer la columna o las restricciones también
- Si el objeto especificado no existe, no da ningún mensaje de error. Continúa la ejecución para el siguiente comando
- IF EXISTS en SQL 2014 o anterior
- DROP IF EXISTS en SQL Server 2016 o posterior
- Autor
- Postes recientes
- Realizar actualizaciones de versiones menores y mayores para AWS RDS SQL Server – 29 de enero, 2021
- Implementación de instancias de AWS RDS PostgreSQL – 27 de enero de 2021
- Migración de sus bases de datos SQL on-premise a AWS RDS SQL Server mediante AWS DMS – 25 de enero de 2021
Si el procedimiento no existe, no se ejecuta el código en una sentencia begin.
Ahora, queremos eliminar este procedimiento si ya existe en la base de datos. Podemos añadir un comando DROP PROCEDURE dentro de una sentencia begin. Este procedimiento almacenado se elimina si ya existe en la base de datos.
También podemos utilizar este método con otros objetos de SQL Server. La siguiente consulta comprueba la existencia de la tabla SQL y la elimina si está allí.
En el artículo, Fragmentos de código SQL en Azure Data Studio, hablamos de fragmentos de código para escribir T-SQL. Se me ocurrió comprobar la sintaxis del snippet sqlCreateStoredProc para un nuevo procedimiento almacenado.
Para ver la definición de este snippet, escribir create proc, pulsar el sqlCreateStoredProc y enter.
Como se muestra en la siguiente imagen, este snippet también utiliza el método IF EXISTS para escribir un procedimiento almacenado.
Sentencia DROP IF EXISTS
SQL Server 2016 proporciona una mejora para comprobar la existencia del objeto y soltarlo si ya existe. Introduce el comando DROP IF EXISTS para este propósito.
La sintaxis de DROP IF EXISTS
DROP OBJECT_TYPE OBJECT_NAME
Podemos utilizar Database, Table, Function, Trigger, Stored Procedure, Column, User, View, Schema, Index, Role para este comando.
Entendamos esta nueva cláusula T-SQL IF EXISTS utilizando varios ejemplos.
DROP Stored Procedure IF EXISTS
En el ejemplo anterior, hemos utilizado DROP Stored Procedure stpGetAllMembers para fines de demostración. Este procedimiento almacenado no existe ahora. Utilicemos el nuevo método y tratemos de soltar el procedimiento almacenado.
1
|
DROP PROCEDURE IF EXISTS stpGetAllMembers;
|
Podemos añadir más código como sentencias print, sentencias create. El siguiente código imprime un mensaje después del comando DROP PROCEDURE.
..
1
2
|
DROP PROCEDURE IF EXISTS stpGetAllMembers
PRINT ‘Stored proc does not exist’
|
Creemos el procedimiento almacenado utilizando esta nueva sintaxis T-SQL comando IF EXISTS. La siguiente consulta arroja el procedimiento almacenado si ya existe, en caso de que no exista, creará uno.
.
1
2
3
. 4
5
6
7
8
9
|
DROP PROCEDURE IF EXISTS stpGetAllMembers;
GO
CREATE PROCEDURE stpGetAllMembers
AS
SELECT table_catalog ,
table_schema ,
table_name ,
table_type
FROM INFORMATION_SCHEMA.TABLES;
|
DROP View IF EXISTS
Podemos utilizar la siguiente consulta para SQL 2016 o posterior para eliminar una vista.
1
2
|
DROP VIEW IF EXISTS vwABC
GO
|
En SQL Server 2014 o versión anterior, utilizamos el siguiente código. Este comprueba las vistas usando sys.objects para el tipo V.
1
2
3
4
|
IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N’vwABC’)
Y type = N’V’)
DROP VIEW vwABC
GO
|
DROP Constraint IF EXISTS
Podemos utilizar el siguiente comando para eliminar una restricción UNIQUE utilizando la sentencia DROP CONSTRAINT IF EXISTS.
1
2
|
ALTER TABLE DemoTable DROP CONSTRAINT IF EXISTS EmpID
GO
|
El siguiente código funciona en SQL 2014 o anterior. El tipo UQ en el sys.objects se refiere a una restricción UNIQUE.
Para una restricción de verificación, cambie el tipo de UQ a C en la consulta de la versión SQL 2014 o anterior. No necesitamos cambiar la consulta especificada utilizando la sentencia DROP CONSTRAINT IF EXISTS.
DROP Table IF EXISTS
Podemos utilizar la sentencia DROP TABLE IF EXISTS para eliminar una tabla SQL también en SQL Server 2016 o posterior.
1
2
|
DROP TABLE IF EXISTS DemoTable
GO
|
Para SQL 2014 o versiones anteriores, tenemos que utilizar el método IF EXISTS como se muestra a continuación. El tipo U se refiere a una tabla SQL definida por el usuario.
1
2
3
4
|
IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N’DemoTable’)
Y type = N’U’)
DROP TABLE DemoTable
GO
|
DROP Database IF EXISTS
Podemos utilizar los nuevos scripts T-SQL If Exists scripts para dejar caer una base de datos SQL también para SQL 2016 o posterior.
1
2
|
DROP DATABASE IF EXISTS TargetDB
GO
|
Alternativamente, utilizar el siguiente script con SQL 2014 o versión inferior. También es válido en las versiones superiores de SQL Server también.
1
2
3
|
IF EXISTS (SELECT 1 FROM sys.databases WHERE database_id = DB_ID(N’TargetDB’))
DROP DATABASE TargetDB
GO
|
DROP Column IF EXISTS
A veces necesitamos eliminar una columna de una tabla SQL. Es una buena práctica también para eliminar las columnas no deseadas. Ahorra esfuerzos para el motor de SQL y mejora el rendimiento de la consulta, mientras que la recuperación de un menor número de registros para la salida.
Dejamos caer una columna utilizando la sentencia Alter Table. Podemos aprovechar DROP COLUMN IF EXISTS también en esta sentencia alter. Supongamos que queremos eliminar una columna Country de la tabla Employee. Utilizamos la siguiente sentencia alter table.
1
2
|
ALTER TABLE Employee DROP COLUMN IF EXISTS Country
GO
|
Es una sola línea y una consulta directa. Alternativamente, usamos la siguiente consulta usando IF Exists. Parece más complicada que la anterior. Deberíamos utilizar la sintaxis de consulta más reciente con las versiones de SQL Server soportadas.
Conclusión
En este artículo, hemos explorado dos versiones diferentes de las sentencias T-SQL IF Exists.
Deberías elegir la sintaxis adecuada para ti. Yo te recomendaría la más reciente (Drop[object[ IF Exists), si estás en SQL 2016 o versiones posteriores.
Es el creador de una de las mayores colecciones online gratuitas de artículos sobre un solo tema, con su serie de 50 partes sobre SQL Server Always On Availability Groups. En base a su contribución a la comunidad de SQL Server, ha sido reconocido con varios premios, incluyendo el prestigioso «Mejor autor del año» continuamente en 2020 y 2021 en SQLShack.
Raj siempre está interesado en nuevos retos por lo que si necesitas ayuda de consultoría sobre cualquier tema tratado en sus escritos, se le puede contactar en [email protected]
Ver todos los posts de Rajendra Gupta