sql - usuario - validar si un registro existe en la base de datos
Cómo verificar si una función existe en una base de datos SQL (5)
¿Por qué no solo?
IF object_id(''YourFunctionName'') IS NOT NULL
BEGIN
DROP FUNCTION [dbo].[YourFunctionName]
END
GO
Al menos esto funciona para mí ...
Necesito averiguar si existe una función en una base de datos, para poder descartarla y volver a crearla. Básicamente debe ser algo así como el siguiente código que utilizo para los procedimientos almacenados:
IF EXISTS (
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID(N''[dbo].[SP_TEST]'')
AND OBJECTPROPERTY(id, N''IsProcedure'') = 1 )
Descubrí que puede usar un enfoque muy simple y directo para verificar la existencia de varios objetos de SQL Server de esta manera:
IF OBJECTPROPERTY (object_id(''schemaname.scalarfuncname''), ''IsScalarFunction'') = 1
IF OBJECTPROPERTY (object_id(''schemaname.tablefuncname''), ''IsTableFunction'') = 1
IF OBJECTPROPERTY (object_id(''schemaname.procname''), ''IsProcedure'') = 1
Esto se basa en la función OBJECTPROPERTY que está disponible en SQL 2005+. El artículo de MSDN se puede encontrar here .
La función OBJECTPROPERTY usa la siguiente firma:
OBJECTPROPERTY ( id , property )
Usted pasa un valor literal en el parámetro de propiedad, designando el tipo de objeto que está buscando. Hay una lista masiva de valores que puedes suministrar.
Esto es lo que usa SSMS cuando se crea una secuencia de comandos usando la opción DROP and CREATE
IF EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N''[dbo].[foo]'')
AND type IN ( N''FN'', N''IF'', N''TF'', N''FS'', N''FT'' ))
DROP FUNCTION [dbo].[foo]
GO
Este enfoque para implementar cambios significa que necesita volver a crear todos los permisos en el objeto para que pueda considerar ALTER
-ing si existe en su lugar.
Sé que este hilo es viejo, pero solo quería agregar esta respuesta para aquellos que creen que es más seguro Alter
que Drop
y Create
. Lo siguiente Alter
la Function
si existe o la creará si no:
IF NOT EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N''[dbo].[foo]'')
AND type IN ( N''FN'', N''IF'', N''TF'', N''FS'', N''FT'' ))
EXEC(''CREATE FUNCTION [dbo].[foo]() RETURNS INT AS BEGIN RETURN 0 END'')
GO
ALTER PROCEDURE [dbo].[foo]
AS
...
Tiendo a usar el Information_Schema:
IF EXISTS ( SELECT 1
FROM Information_schema.Routines
WHERE Specific_schema = ''dbo''
AND specific_name = ''Foo''
AND Routine_Type = ''FUNCTION'' )
para funciones y cambie Routine_Type
para procedimientos almacenados
IF EXISTS ( SELECT 1
FROM Information_schema.Routines
WHERE Specific_schema = ''dbo''
AND specific_name = ''Foo''
AND Routine_Type = ''PROCEDURE'' )