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.

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

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')

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

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   


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.


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


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

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;


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.