111 votes

Comment supprimer une fonction si elle existe déjà ?

Je sais que cela doit être simple, mais comment puis-je faire précéder la création d'une fonction d'une vérification pour voir si elle existe déjà ? Si elle existe, je veux la laisser tomber et la recréer.

205voto

adrianbanks Points 36858
IF EXISTS (
    SELECT * FROM sysobjects WHERE id = object_id(N'function_name') 
    AND xtype IN (N'FN', N'IF', N'TF')
)
    DROP FUNCTION function_name
GO

Si vous voulez éviter les tables sys*, vous pourriez plutôt faire (à partir de aquí dans l'exemple A) :

IF object_id(N'function_name', N'FN') IS NOT NULL
    DROP FUNCTION function_name
GO

La principale chose à retenir est le type de fonction que vous essayez de supprimer (désignée dans le sql du haut par FN, IF et TF) :

  • FN = Fonction scalaire
  • IF = Inlined Table Function
  • TF = Fonction de table

0 votes

Merci, je ne savais pas que Object_id avait un second paramètre pour le type d'objet.

1 votes

Étant donné que les noms d'objets (qui apparaissent dans sys.objects) doivent être uniques, l'interrogation de xtype est redondante. Essayez de créer une table et une procédure stockée avec le même nom...

24voto

Sparky Points 9253
if object_id('FUNCTION_NAME') is not NULL
   DROP FUNCTION <name>

Vous pouvez aussi chercher le nom dans sysobjects

IF EXISTS (SELECT * 
       FROM   sysobjects 
           WHERE name='<function name>' and xtype='FN'

En fait, si la fonction peut être une fonction de table, vous devez utiliser

xtype in ('FN','TF')

2 votes

J'ai toujours préféré la méthode Object_id, elle semble plus simple à lire dans le code. Je suis toujours curieux de savoir pourquoi l'exemple de code généré par Microsoft utilise la recherche sys.objects à la place...

15voto

Metaphor Points 1402

Cela fonctionne pour tout et pas seulement des fonctions :

IF OBJECT_ID('YourObjectName') IS NOT NULL 

puis il suffit d'ajouter votre goût d'objet, comme dans :

IF OBJECT_ID('YourFunction') IS NOT NULL
   DROP FUNCTION YourFunction

6voto

IF EXISTS 
(SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'functionName') 
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))

DROP FUNCTION functionName
GO

2voto

Jeff Walker Points 943

Je me méfie généralement des requêtes sur les tables de type sys*, les fournisseurs ont tendance à les modifier entre les versions, majeures ou non. Ce que j'ai toujours fait, c'est d'émettre le DROP FUNCTION <name> et ne pas s'inquiéter d'une éventuelle erreur SQL. Je considère que c'est une procédure standard dans le domaine des DBA.

1 votes

Sys. dans SQL Server 2005 est la manière officielle. Ils sont vues pas des tables de nos jours et les véritables tables sys nous sont cachées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X