2010-02-18 2 views

Antwort

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 

Wenn Sie verwenden müssen Möchten Sie die sys * -Tabellen vermeiden, können Sie stattdessen (von here in Beispiel A):

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

Die Hauptsache zu fangen ist, welche Art von Funktion, die Sie versuchen, zu löschen (in der oberen SQL bezeichnet mit FN, IF und TF):

  • FN = Skalarfunktion
  • IF = inlined Tabelle Funktion
  • TF = Tabelle Funktion
+0

Hey danke, ich wusste nicht object_id hatte einen zweiten Parameter für den Objekttyp – Sparky

+1

gegebenen Objektnamen (die in sys.objects erscheinen) Um eindeutig zu sein, ist die Abfrage von xtype redundant. Versuchen Sie, eine Tabelle und eine gespeicherte Prozedur mit dem gleichen Namen zu erstellen ... – gbn

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

Sie auch den Namen

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

Eigentlich in sysobjects nach oben schauen können, wenn die Funktion eine Tabelle Funktion sein könnte, Sie

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

+1 für eine einfache object_id Verwendung – gbn

+2

ich die Object_id Methode immer bevorzugt haben scheint es einfacher zu sein, den Code zu lesen. Immer neugierig, warum der von Microsoft generierte Beispielcode stattdessen die sys.objects-Suche verwendet ... – Sparky

2

ich schrecken in der Regel weg von Anfragen von sys * Typ Tabellen, neigen Anbieter diese zwischen den Versionen zu ändern, major oder anderweitig. Was ich immer gemacht habe, ist, die DROP FUNCTION <name> Anweisung herauszugeben und sich nicht um irgendwelche SQL Fehler zu sorgen, die zurückkommen könnten. Ich betrachte diese Standardprozedur im DBA-Bereich.

+1

sys. in SQL Server 2005 ist der offizielle Weg. Sie sind * Ansichten * nicht Tabellen heutzutage und die tatsächlichen sys Tabellen sind von uns verborgen. – 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

Dies funktioniert für jedes Objekt, nicht nur Funktionen:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

dann nur Ihren Geschmack des Objekts hinzufügen, wie in:

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

Dies fügt den bereits vorhandenen Antworten nichts hinzu. – TZHX

0

Von SQL Server 2016 CTP3 Sie kann neue DIE Stateme verwenden nts statt großer IF Wrapper

Syntax:

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

Abfrage:

DROP Function IF EXISTS udf_name 

Mehr Infos here

0

Hier ist mein nehmen auf diesem:

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

Sie zwei Möglichkeiten um die Prozedur in SQL Server 2016 zu löschen und neu zu erstellen.

Ausgehend von SQL Server 2016 - verwenden "IF exists"

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

Ausgehend von SQL Server 2016 SP1 - Verwendung "OR ALTER"

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

Check For Funktion existieren, wenn

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 

Überprüfen Sie, ob Exist für Stored procedure, Funktion auch durch Klicken auf den folgenden Link http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html

0

Wenn Sie die SQL-ISO-Standard INFORMATION_SCHEMA und nicht die SQL Server-spezifische sysobjects verwenden möchten, können Sie dies tun:

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