Làm cách nào để bỏ một hàm nếu nó đã tồn tại?


101

Tôi biết điều này phải đơn giản, nhưng làm thế nào để tôi bắt đầu việc tạo một hàm với một dấu kiểm để xem nó đã tồn tại chưa? Nếu nó tồn tại, tôi muốn xóa và tạo lại nó.

Câu trả lời:


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

Nếu bạn muốn tránh các bảng sys *, thay vào đó bạn có thể làm (từ đây trong ví dụ A):

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

Điều chính cần nắm bắt là loại hàm bạn đang cố gắng xóa (được biểu thị trong sql hàng đầu bằng FN, IF và TF):

  • FN = Hàm vô hướng
  • IF = Hàm bảng nội tuyến
  • TF = Chức năng Bảng

Xin cảm ơn, tôi không biết Object_id có tham số thứ hai cho loại đối tượng
Sparky

1
tên đối tượng đã cho (xuất hiện trong sys.objects) phải là duy nhất, truy vấn xtype là dư thừa. Hãy thử tạo một bảng và một proc được lưu trữ có cùng tên ...
gbn

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

Bạn cũng có thể tra cứu tên trong sysobjects

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

Trên thực tế, nếu hàm có thể là một hàm bảng, bạn cần sử dụng

xtype in ('FN','TF')

2
Tôi luôn thích phương thức Object_id, nó có vẻ đơn giản hơn để đọc trong mã. Luôn tò mò tại sao mã mẫu do Microsoft tạo lại sử dụng tra cứu sys.objects thay thế ...
Sparky

12

Điều này hoạt động cho bất kỳ đối tượng nào , không chỉ các chức năng:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

sau đó chỉ cần thêm hương vị đối tượng của bạn, như trong:

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

11

Bạn có hai tùy chọn để bỏ và tạo lại quy trình trong SQL Server 2016.

Bắt đầu từ SQL Server 2016 - sử dụng IF EXISTS

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

Bắt đầu từ SQL Server 2016 SP1 - sử dụng 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

Tôi thường né tránh các truy vấn từ các bảng kiểu sys *, các nhà cung cấp có xu hướng thay đổi những điều này giữa các bản phát hành, chính hoặc khác. Những gì tôi luôn làm là phát hành DROP FUNCTION <name>câu lệnh và không lo lắng về bất kỳ lỗi SQL nào có thể quay trở lại. Tôi coi đó là thủ tục tiêu chuẩn trong lĩnh vực DBA.


1
sys. trong SQL Server 2005 là cách chính thức. Họ là những quan điểm không bảng hiện nay và các bảng sys thực tế được ẩn từ chúng tôi.
gbn

2

Từ SQL Server 2016 CTP3bạn có thể sử dụng các câu lệnh DIE mới thay vì các IFtrình bao bọc lớn

Cú pháp:

CHỨC NĂNG DROP [NẾU TỒN TẠI] {[schema_name. ] function_name} [, ... n]

Truy vấn:

DROP Function IF EXISTS udf_name

Thông tin thêm tại đây



0

Đây là công việc của tôi:

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

Kiểm tra IF tồn tại cho chức năng

 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

Kiểm tra NẾU Tồn tại cho quy trình Đã lưu trữ, Chức năng cũng bằng cách nhấp vào liên kết bên dưới http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger- Chức năng- and.html


0

Nếu bạn muốn sử dụng tiêu chuẩn SQL ISO INFORMATION_SCHEMA và không dành riêng cho SQL Server sysobjects, bạn có thể thực hiện việc này:

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.