web-dev-qa-db-fra.com

Comment vérifier si une fonction existe sur une base de données SQL

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 )
124
Dr. Greenthumb

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 ALTERing si Exists.

190
Martin Smith

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' ) 
56
Law Metzler

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:

  • FN: fonction scalaire
  • IF: fonction de table inline
  • TF: fonction de valeur de table
  • FS: fonction scalaire d'assemblage (CLR)
  • FT: Fonction de table table Assembly (CLR)
30
Kapé

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.

9
Jeremy

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
  ...
5
jamiedanq