2010-02-18 5 views

Répondre

148
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 faire à la place (à partir de here dans l'exemple A):

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

La principale chose à attraper est ce type de fonction que vous essayez de supprimer (notée dans le sql haut par FN, IF et TF):

  • FN = Scalar Fonction
  • IF = inline Tableau Fonction
  • TF = Fonction Tableau
+0

Hey merci, je ne savais pas Object_id avait un deuxième paramètre pour le type d'objet – Sparky

+1

noms d'objets donnés (qui apparaissent dans sys.objects) ont Pour être unique, l'interrogation de xtype est redondante. Essayez de créer une table et un proc enregistré avec le même nom ... – gbn

18
if object_id('FUNCTION_NAME') is not NULL 
    DROP FUNCTION <name> 

Vous pouvez également regarder le nom dans sysobjects

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

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

xtype in ('FN','TF') 
+0

+1 pour une utilisation simple object_id – gbn

+2

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

2

Je timide habituellement loin de requêtes de tables de type sys *, les vendeurs ont tendance à changer ces entre les versions, majeures ou autrement. Ce que j'ai toujours fait est d'émettre l'instruction DROP FUNCTION <name> et ne pas se soucier de toute erreur SQL qui pourrait revenir. Je considère cette procédure standard dans le domaine DBA.

+1

sys. dans SQL Server 2005 est la manière officielle. Ils sont * vues * pas des tables de nos jours et les tables sys réels sont cachés de nous. – gbn

5
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 
6

Cela fonctionne pour tout objet, non seulement les fonctions:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

ajoutez simplement votre goût de l'objet, comme dans:

IF OBJECT_ID('YourFunction') IS NOT NULL 
    DROP FUNCTION YourFunction 
GO 
0
IF EXISTS 
     (SELECT * 
     FROM schema.sys.objects 
     WHERE name = 'func_name') 
    DROP FUNCTION [dbo].[func_name] 
GO 
+2

Cela n'ajoute rien aux réponses déjà existantes. – TZHX

0

De SQL Server 2016 CTP3 vous peut utiliser nouveau DIE stateme nts au lieu des grandes IF emballages

Syntaxe:

FONCTION DROP [IF EXISTS] {[schema_name. ] Nom_fonction} [, ... n ]

Requête:

DROP Function IF EXISTS udf_name 

Plus d'info here

0

Voici mon avis 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; 
5

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

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

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

A partir de SQL Server 2016 SP1 - l'utilisation "OU TRANSFORMER"

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name 
0

Vérifiez si elles existent 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 IF Existe pour la procédure stockée, Fonctionne également en cliquant sur le lien ci-dessous http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html

0

Si vous voulez utiliser l'INFORMATION_SCHEMA SQL standard ISO et non la vous pouvez faire spécifiques à SQL Server sysobjects, ceci:

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