Je dois savoir si une fonction existe dans une base de données afin de pouvoir la supprimer et la recréer. Il devrait en principe ressembler au code suivant que j'utilise pour les procédures stockées:
IF EXISTS (
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[SP_TEST]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
C’est ce que SSMS utilise lorsque vous écrivez un script en utilisant le DROP and CREATE
option
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
Cette approche du déploiement des modifications signifie que vous devez recréer toutes les autorisations sur l'objet afin que vous puissiez considérer plutôt ALTER
ing si Exists.
J'ai tendance à utiliser Information_Schema:
IF EXISTS ( SELECT 1
FROM Information_schema.Routines
WHERE Specific_schema = 'dbo'
AND specific_name = 'Foo'
AND Routine_Type = 'FUNCTION' )
pour les fonctions, et change Routine_Type
pour les procédures stockées
IF EXISTS ( SELECT 1
FROM Information_schema.Routines
WHERE Specific_schema = 'dbo'
AND specific_name = 'Foo'
AND Routine_Type = 'PROCEDURE' )
Pourquoi pas simplement:
IF object_id('YourFunctionName', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION [dbo].[YourFunctionName]
END
GO
Le deuxième argument de object_id
est facultatif, mais peut aider à identifier le bon objet. Les valeurs possibles pour le type sont:
J'ai constaté que vous pouvez utiliser une approche très simple et très simple pour vérifier l'existence de divers objets SQL Server de cette manière:
IF OBJECTPROPERTY (object_id('schemaname.scalarfuncname'), 'IsScalarFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.tablefuncname'), 'IsTableFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.procname'), 'IsProcedure') = 1
Ceci est basé sur la fonction OBJECTPROPERTY disponible dans SQL 2005+. L'article MSDN peut être trouvé ici .
La fonction OBJECTPROPERTY utilise la signature suivante:
OBJECTPROPERTY ( id , property )
Vous transmettez une valeur littérale au paramètre de propriété, en désignant le type d'objet que vous recherchez. Il y a une liste énorme de valeurs que vous pouvez fournir.
Je sais que ce fil est ancien mais je voulais juste ajouter cette réponse à ceux qui pensent que c'est plus sûr de Alter
que de Drop
et de Create
. Le ci-dessous va Alter
le Function
s'il existe ou Create
il si ne le fait pas:
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 FUNCTION [dbo].[foo]
AS
...