web-dev-qa-db-fra.com

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

Je sais que cela doit être simple, mais comment puis-je précéder la création d'une fonction par un contrôle pour voir si elle existe déjà? S'il existe, je veux le supprimer et le recréer. 

87
DavidStein
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 pouvez plutôt faire (à partir de ici dans l'exemple A):

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

La principale chose à saisir est le type de fonction que vous essayez de supprimer (indiqué dans le haut du carré par FN, FN, IF et TF):

  • FN = fonction scalaire
  • IF = Fonction de table en ligne
  • TF = Fonction de table
166
adrianbanks
if object_id('FUNCTION_NAME') is not NULL
   DROP FUNCTION <name>

Vous pouvez également rechercher 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')
21
Sparky

Cela fonctionne pour n'importe quel objet, pas seulement pour les fonctions:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

puis ajoutez simplement votre saveur d'objet, comme dans:

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

Vous avez deux options pour supprimer et recréer la procédure dans SQL Server 2016. 

A partir de SQL Server 2016 - utilisez "IF EXISTS"

DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]   
    [;]

A partir de SQL Server 2016 SP1 - utilisez "OU ALTER"

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
7
Konrad
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

Je crains généralement les requêtes provenant de tables de type sys *, les fournisseurs ayant tendance à les modifier entre les versions, majeure ou non. Ce que j'ai toujours fait est d'émettre l'instruction DROP FUNCTION <name> et de ne pas m'inquiéter des erreurs SQL susceptibles de se produire. Je considère cette procédure standard dans le domaine DBA.

2
Jeff Walker

Si vous souhaitez utiliser la norme ISO ISO SQL INFORMATION_SCHEMA et non la variable sysobjects spécifique à SQL Server, procédez comme suit:

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
0
Ed Greaves

Voici mon point de vue sur ceci:

if(object_id(N'[dbo].[fn_Nth_Pos]', N'FN')) is not null
    drop function [dbo].[fn_Nth_Pos];
GO
CREATE FUNCTION [dbo].[fn_Nth_Pos]
(
    @find char, --char to find
    @search varchar(max), --string to process   
    @nth int --occurrence   
)
RETURNS int
AS
BEGIN
    declare @pos int --position of nth occurrence
    --init
    set @pos = 0

    while(@nth > 0)
    begin       
        set @pos = charindex(@find,@search,@pos+1)
        set @nth = @nth - 1
    end 

    return @pos
END
GO

--EXAMPLE
declare @files table(name varchar(max));

insert into @files(name) values('abc_1_2_3_4.gif');
insert into @files(name) values('zzz_12_3_3_45.gif');

select
    f.name,
    dbo.fn_Nth_Pos('_', f.name, 1) as [1st],
    dbo.fn_Nth_Pos('_', f.name, 2) as [2nd],
    dbo.fn_Nth_Pos('_', f.name, 3) as [3rd],
    dbo.fn_Nth_Pos('_', f.name, 4) as [4th]
from 
    @files f;
0
Alex

À partir de SQL Server 2016 CTP3, vous pouvez utiliser les nouvelles instructions DIE au lieu de grands wrappers IF

Syntaxe:

DROP FUNCTION [IF EXISTS] {[nom_schéma. ] nom_fonction} [ ... n ]

Question:

DROP Function IF EXISTS udf_name

Plus d'infos ici

0
Pரதீப்

Vérifier si existe pour la fonction

 IF  EXISTS (SELECT TOP 1 1 FROM sys.objects WHERE 
        object_id = OBJECT_ID(N'[Schema].[function_Name]')
         AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
BEGIN
DROP FUNCTION [Schema].[function_Name]
Print('function dropped => [Schema].[function_Name]')
END
GO

Vérifiez si la procédure stockée existe déjà, Fonction également en cliquant sur le lien ci-dessous http://www.gurujipoint.com 2017/05/check-if-exist-for-trigger-function-and.html

0
Jatin Phulera
IF EXISTS
      (SELECT * 
      FROM schema.sys.objects
      WHERE name = 'func_name')
    DROP FUNCTION [dbo].[func_name]
GO
0
user2419223