함수가 이미있는 경우 어떻게 삭제합니까?


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

가장 중요한 것은 삭제하려는 함수의 유형 (FN, IF 및 TF로 최상위 SQL에 표시됨)입니다.

  • FN = 스칼라 함수
  • IF = 인라인 테이블 함수
  • TF = 테이블 함수

감사 이봐, 난 OBJECT_ID는 오브젝트의 유형에 대한 두 번째 매개 변수 몰랐
스파키

1
주어진 개체 이름 (sys.objects에 표시됨)은 고유해야하며 xtype 쿼리는 중복됩니다. 같은 이름의 테이블과 저장된 프로 시저를 만들어보십시오 ...
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 대신 조회 사용
스파키

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   

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

나는 일반적으로 sys * 유형 테이블의 쿼리를 피하고 공급 업체는 주요 릴리스 또는 기타 릴리스간에이를 변경하는 경향이 있습니다. 내가 항상 한 일은 DROP FUNCTION <name>명령문 을 발행하고 다시 발생할 수있는 SQL 오류에 대해 걱정하지 않는 것입니다. DBA 영역의 표준 절차를 고려합니다.


1
sys. SQL Server 2005에서는 공식적인 방법입니다. 요즘에는 테이블 이 아닌 이며 실제 sys 테이블은 우리에게 숨겨져 있습니다.
gbn

2

에서 SQL Server 2016 CTP3당신은 새 사용할 수 있습니다 다이 문 대신 큰 IF래퍼를

구문 :

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

질문:

DROP Function IF EXISTS udf_name

여기에 더 많은 정보


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

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

SQL Server 전용이 아닌 SQL ISO 표준 INFORMATION_SCHEMA를 사용하려는 경우 다음 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.