2010-02-18 22 views

Respuesta

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 desea evitar las tablas sys *, en su lugar podría hacer (desde here en el ejemplo A):

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

Lo principal para coger es qué tipo de función que está intentando eliminar (denotado en el sql superior por FN, IF y TF):

  • FN = función escalar
  • SI = inline Tabla de funciones
  • TF = Tabla de funciones
+0

Oye, gracias, no sabía que Object_id tenía un segundo parámetro para el tipo de objeto – Sparky

+1

nombres de objeto dados (que aparecen en sys.objects) para ser único, consultar xtype es redundante. Intente crear una tabla y un proceso almacenado con el mismo nombre ... – gbn

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

También puede buscar el nombre en sysobjects

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

En realidad, si la función podría ser una función de tabla, es necesario utilizar

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

+1 para un uso simple object_id – gbn

+2

Siempre he preferido el método OBJECT_ID , parece más simple de leer en el código. Siempre curioso por qué el código de muestra generado por Microsoft usa la búsqueda de sys.objects en su lugar ... – Sparky

2

lo general asusto de consultas de tablas de tipo sys *, los vendedores tienden a cambiar estos términos entre versiones principales, o de otro tipo. Lo que siempre he hecho es emitir la declaración DROP FUNCTION <name> y no preocuparme por ningún error SQL que pueda surgir. Considero que el procedimiento estándar en el reino DBA.

+1

sys. en SQL Server 2005 es la forma oficial. Son * vistas * no tablas hoy en día y las tablas sys reales están ocultas de nosotros. – 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

Esto funciona para cualquier objeto, no sólo funciones:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

continuación, basta con añadir su sabor del objeto, como en:

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

Esto no agrega nada a las respuestas ya existentes. – TZHX

0

De SQL Server 2016 CTP3 se puede usar el nuevo DIE stateme NTS en lugar de grandes IF envoltorios

Sintaxis:

DROP FUNCIÓN [SI EXISTE] {[schema_name. ] Function_name} [, ... n ]

Consulta:

DROP Function IF EXISTS udf_name 

Más información here

0

Aquí está mi opinión sobre esto:

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

Usted tiene dos opciones para quitar y volver a crear el procedimiento en SQL Server 2016.

A partir de SQL Server 2016 - utilice "si existe"

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

A partir de SQL Server 2016 SP1 - Uso "o ALTER"

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

Comprobar si existen para la función

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 

Compruebe si existe para el procedimiento almacenado, función también haciendo clic en el enlace de abajo http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html

0

Si desea utilizar el INFORMATION_SCHEMA norma ISO SQL y no el SQL sysobjects específica del servidor, se puede hacer esto:

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