Zaten varsa bir işlevi nasıl kaldırırım?


101

Bunun basit olması gerektiğini biliyorum, ancak bir işlevin oluşturulmasına önceden var olup olmadığını kontrol ederek nasıl önsöz yapabilirim? Varsa, onu bırakıp yeniden oluşturmak istiyorum.

Yanıtlar:


187
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

Sys * tablolarından kaçınmak istiyorsanız, bunun yerine yapabilirsiniz ( buradan örnek A'da):

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

Yakalanacak en önemli şey, silmeye çalıştığınız işlevin türüdür (en üstteki sql'de FN, IF ve TF ile gösterilir):

  • FN = Skaler Fonksiyon
  • IF = Satır İçi Tablo Fonksiyonu
  • TF = Tablo Fonksiyonu

Hey teşekkürler, Object_id'in nesne türü için ikinci bir parametresi olduğunu bilmiyordum
Sparky

1
verilen nesne adları (sys.objects'te görünen) benzersiz olmalıdır, xtype sorgusu gereksizdir. Aynı ada sahip bir tablo ve depolanmış bir işlem oluşturmayı deneyin ...
gbn

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

İsmi sysobjects'te de arayabilirsiniz.

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

Aslında, işlev bir tablo işlevi olabilirse, kullanmanız gerekir

xtype in ('FN','TF')

2
Her zaman Object_id yöntemini tercih ettim, kodda okumak daha kolay görünüyor. Microsoft tarafından üretilen örnek kodun neden bunun yerine sys.objects aramasını kullandığını her zaman merak ediyorum ...
Sparky

12

Bu , yalnızca işlevler için değil, herhangi bir nesne için çalışır :

IF OBJECT_ID('YourObjectName') IS NOT NULL 

sonra, şundaki gibi, nesnenin lezzetini ekleyin:

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

11

Yordamı SQL Server 2016'da bırakıp yeniden oluşturmak için iki seçeneğiniz vardır.

SQL Server 2016'dan başlayarak - kullanım IF EXISTS

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

SQL Server 2016 SP1'den başlayarak - kullanım OR ALTER

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   

6
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

2

Genellikle sys * tipi tablolardan gelen sorgulardan uzak dururum, satıcılar bunları büyük veya başka sürümler arasında değiştirme eğilimindedir. Her zaman yaptığım şey DROP FUNCTION <name>ifadeyi yayınlamak ve geri gelebilecek herhangi bir SQL hatası için endişelenmemek. DBA dünyasındaki bu standart prosedürü düşünüyorum.


1
sys. SQL Server 2005'te resmi yoldur. Bunlar günümüzde tablo değil görünümlerdir ve gerçek sys tabloları bizden gizlenmiştir.
gbn

2

Gönderen SQL Server 2016 CTP3Yeni kullanabilirsiniz DİE ifadeleri yerine büyük IFsarmalayıcılarını

Sözdizimi:

DROP FONKSİYONU [VARSA] {[şema_adı. ] işlev_adı} [, ... n]

Sorgu:

DROP Function IF EXISTS udf_name

Daha fazla bilgi burada


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

0

İşte bu konudaki görüşüm:

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

SQL Server'a özgü değil, SQL ISO standardı INFORMATION_SCHEMA kullanmak istiyorsanız sysobjects, bunu yapabilirsiniz:

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.