ฉันจะทิ้งฟังก์ชันได้อย่างไรหากมีอยู่แล้ว


101

ฉันรู้ว่าสิ่งนี้ต้องง่าย แต่ฉันจะนำหน้าการสร้างฟังก์ชันด้วยการตรวจสอบเพื่อดูว่ามีอยู่แล้วได้อย่างไร หากมีอยู่ฉันต้องการปล่อยและสร้างใหม่

คำตอบ:


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 * คุณสามารถทำได้ (จากที่นี่ในตัวอย่าง A):

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

สิ่งสำคัญที่ต้องจับคือประเภทของฟังก์ชันที่คุณพยายามลบ (แสดงใน sql ด้านบนโดย FN, IF และ TF):

  • FN = ฟังก์ชันสเกลาร์
  • IF = ฟังก์ชันตารางแบบอินไลน์
  • TF = ฟังก์ชันตาราง

สวัสดีขอบคุณฉันไม่ทราบว่า Object_id มีพารามิเตอร์ที่สองสำหรับประเภทของวัตถุ
Sparky

1
ชื่ออ็อบเจ็กต์ที่กำหนด (ที่ปรากฏใน sys.objects) ต้องไม่ซ้ำกันการเคียวรี xtype ซ้ำซ้อน ลองสร้างตารางและ proc ที่จัดเก็บด้วยชื่อเดียวกัน ...
gbn

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

คุณยังสามารถค้นหาชื่อใน sysobjects

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

อันที่จริงถ้าฟังก์ชันนั้นอาจเป็นฟังก์ชันตารางคุณต้องใช้

xtype in ('FN','TF')

2
ฉันชอบเมธอด Object_id มาโดยตลอดดูเหมือนว่าจะอ่านง่ายกว่าในโค้ด อยากรู้เสมอว่าทำไม Microsoft สร้างโค้ดตัวอย่างจึงใช้ sys.objects lookup แทน ...
Sparky

12

สิ่งนี้ใช้ได้กับวัตถุใด ๆไม่ใช่แค่ฟังก์ชั่น:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

จากนั้นเพิ่มรสชาติของวัตถุของคุณเช่น:

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

11

คุณมีสองตัวเลือกในการปล่อยและสร้างขั้นตอนใหม่ใน SQL Server 2016

เริ่มจาก SQL Server 2016 - ใช้ IF EXISTS

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

เริ่มจาก SQL Server 2016 SP1 - ใช้ OR ALTER

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   


2

ฉันมักจะไม่สนใจคำถามจากตารางประเภท sys * ผู้ขายมักจะเปลี่ยนสิ่งเหล่านี้ระหว่างรุ่นหลักหรืออื่น ๆ สิ่งที่ฉันทำมาตลอดคือออกDROP FUNCTION <name>คำสั่งและไม่ต้องกังวลกับข้อผิดพลาดของ SQL ที่อาจกลับมา ฉันพิจารณาขั้นตอนมาตรฐานนั้นในขอบเขต DBA


1
sys. ใน SQL Server 2005 เป็นวิธีที่เป็นทางการ พวกเขาเป็นมุมมองไม่ใช่ตารางในปัจจุบันและตาราง sys จริงถูกซ่อนจากเรา
gbn

2

จากSQL Server 2016 CTP3คุณสามารถใช้ คำสั่งDIEใหม่แทนการIFห่อใหญ่

ไวยากรณ์:

ฟังก์ชัน DROP [IF EXISTS] {[schema_name. ] function_name} [, ... n]

คำถาม:

DROP Function IF EXISTS udf_name

ข้อมูลเพิ่มเติมที่นี่



0

นี่คือสิ่งที่ฉันทำ:

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

ตรวจสอบว่ามีอยู่สำหรับฟังก์ชัน

 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

ตรวจสอบว่ามีอยู่สำหรับขั้นตอนการจัดเก็บฟังก์ชั่นโดยคลิกที่ลิงค์ด้านล่างhttp://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html


0

หากคุณต้องการใช้ INFORMATION_SCHEMA มาตรฐาน SQL ISO และไม่ใช่เฉพาะ SQL Server sysobjectsคุณสามารถทำได้:

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.