Bagaimana cara membatalkan fungsi jika sudah ada?

101

Saya tahu ini pasti sederhana, tetapi bagaimana cara saya mendahului pembuatan fungsi dengan cek untuk melihat apakah sudah ada? Jika ada, saya ingin melepaskan dan membuatnya kembali.

DavidStein
sumber

Jawaban:

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

Jika Anda ingin menghindari tabel sys *, Anda dapat melakukannya (dari sini di contoh A):

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

Hal utama yang harus diperhatikan adalah jenis fungsi apa yang Anda coba hapus (dilambangkan di sql atas oleh FN, IF dan TF):

  • FN = Fungsi Skalar
  • IF = Fungsi Tabel Inline
  • TF = Fungsi Tabel
adrianbanks
sumber
Hei terima kasih, saya tidak tahu Object_id memiliki parameter kedua untuk jenis objek
Sparky
1
nama objek yang diberikan (yang muncul di sys.objects) harus unik, meminta xtype berlebihan. Coba buat tabel dan proc yang disimpan dengan nama yang sama ...
gbn
22
if object_id('FUNCTION_NAME') is not NULL
   DROP FUNCTION <name>

Anda juga dapat mencari nama tersebut di sysobjects

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

Sebenarnya, jika fungsinya bisa menjadi fungsi tabel, Anda perlu menggunakan

xtype in ('FN','TF')
Sparky
sumber
2
Saya selalu lebih suka metode Object_id, tampaknya lebih mudah dibaca di kode. Selalu penasaran mengapa kode sampel yang dibuat Microsoft menggunakan pencarian sys.objects sebagai gantinya ...
Sparky
12

Ini berfungsi untuk objek apa pun , bukan hanya fungsi:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

lalu tambahkan rasa objek Anda, seperti di:

IF OBJECT_ID('YourFunction') IS NOT NULL
   DROP FUNCTION YourFunction
Metafora
sumber
11

Anda memiliki dua opsi untuk melepaskan dan membuat ulang prosedur di SQL Server 2016.

Mulai dari SQL Server 2016 - gunakan IF EXISTS

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

Mulai dari SQL Server 2016 SP1 - gunakan OR ALTER

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
Konrad
sumber
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
Fiona - situs web yang dapat diakses
sumber
2

Saya biasanya menghindar dari kueri dari tabel tipe sys *, vendor cenderung mengubahnya di antara rilis, utama atau lainnya. Apa yang selalu saya lakukan adalah mengeluarkan DROP FUNCTION <name>pernyataan dan tidak khawatir tentang kesalahan SQL yang mungkin muncul kembali. Saya menganggap prosedur standar itu di ranah DBA.

Jeff Walker
sumber
1
sys. di SQL Server 2005 adalah cara resmi. Sekarang ini adalah view bukan tabel dan tabel sys sebenarnya disembunyikan dari kita.
gbn
2

Dari SQL Server 2016 CTP3Anda dapat menggunakan pernyataan DIE baru, bukan IFpembungkus besar

Sintaks:

FUNGSI DROP [JIKA ADA] {[schema_name. ] function_name} [, ... n]

Pertanyaan:

DROP Function IF EXISTS udf_name

Info selengkapnya di sini

P ரதீப்
sumber
0
IF EXISTS
      (SELECT * 
      FROM schema.sys.objects
      WHERE name = 'func_name')
    DROP FUNCTION [dbo].[func_name]
GO
pengguna2419223
sumber
0

Inilah pendapat saya tentang ini:

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;
Alex
sumber
0

Periksa JIKA Ada Untuk Fungsi

 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

Periksa JIKA Ada untuk prosedur Tersimpan, Fungsi juga dengan mengklik tautan di bawah ini http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html

Jatin Phulera
sumber
0

Jika Anda ingin menggunakan SQL ISO standar INFORMATION_SCHEMA dan bukan khusus SQL Server sysobjects, Anda dapat melakukan ini:

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