함수가 SQL 데이터베이스에 존재하는지 확인하는 방법


138

함수가 데이터베이스에 존재하는지 찾아서 삭제하고 다시 만들 수 있어야합니다. 저장 프로 시저에 사용하는 기본 코드는 다음과 같습니다.

IF EXISTS (
     SELECT  *
     FROM    dbo.sysobjects
     WHERE   id = OBJECT_ID(N'[dbo].[SP_TEST]')
             AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )

답변:


206

DROP and CREATE옵션을 사용하여 스크립트를 작성할 때 SSMS가 사용하는 것입니다

IF EXISTS (SELECT *
           FROM   sys.objects
           WHERE  object_id = OBJECT_ID(N'[dbo].[foo]')
                  AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' ))
  DROP FUNCTION [dbo].[foo]

GO 

변경 사항을 배포하기위한 이러한 접근 방식은 개체에 대한 모든 권한을 다시 만들어야하므로 기존의 ALTER경우 -ing을 고려할 수 있습니다 .


17
sys.functions 시스템 카탈로그 뷰 가없는 이유 궁금 합니다 ...
marc_s

61

Information_Schema를 사용하는 경향이 있습니다.

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'FUNCTION' ) 

함수 및 Routine_Type저장 프로 시저 변경

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'PROCEDURE' ) 

2
쿨 나는 이런 것을 찾고 있었고 그것을 찾지 못했습니다. information_schema는 특정 RDBMS에 묶여 있지 않으므로 일반적으로 사용하는 것이 좋습니다. (크로스 플랫폼 호환이라는 개념은이 답변에서 나왔습니다 : stackoverflow.com/a/14290099/420667 )
user420667

40

왜 그냥 :

IF object_id('YourFunctionName', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[YourFunctionName]
END
GO

두 번째 인수 object_id는 선택 사항이지만 올바른 개체를 식별하는 데 도움이 될 수 있습니다. 있다 수많은 가능한 값 , 특히 이러한 유형의 인수에 대한이 :

  • FN : 스칼라 함수
  • IF : 인라인 테이블 반환 함수
  • TF : 테이블 반환 함수
  • FS : 어셈블리 (CLR) 스칼라 함수
  • FT : 어셈블리 (CLR) 테이블 반환 함수

4
기술적으로는 해당 이름의 개체가 있는지 확인하기 때문에 실패 할 수 있습니다. 객체가 있고 함수라는 것이 아닙니다. EG 그렇다면 CREATE TABLE YourFunctionName(X INT);코드 실행이 실패합니다.
마틴 스미스

1
@MartinSmith : 쉽게 만들 수 있습니다. 그냥 사용 object_id('YourFunction', 'FN')하거나하게 다른 지정자 (두 번째 인수는) 어떤 객체의 당신을 참조하는지 취소합니다.
darlove

두 번째 매개 변수로 'FN'을 사용하는 @darlove가 작동하지 않을 수 있습니다. 방금 배웠어요 'FN'은 스칼라 함수를 의미합니다. 이 링크는 sqlhints.com/tag/how-to-check-if-function-exists 를 전달할 수있는 다양한 매개 변수 값을 알려줍니다 . 기존 테이블 값 함수를 확인하기 위해 'FN'을 계속 사용하는데 작동하지 않습니다. 'TF'를 사용해야합니다
user12345

9

이 방법으로 다양한 SQL Server 개체의 존재를 확인하기 위해 매우 간결하고 간단한 방법을 사용할 수 있습니다.

IF OBJECTPROPERTY (object_id('schemaname.scalarfuncname'), 'IsScalarFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.tablefuncname'), 'IsTableFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.procname'), 'IsProcedure') = 1

이것은 SQL 2005+에서 사용 가능한 OBJECTPROPERTY 함수를 기반으로합니다. MSDN 기사는 여기 에서 찾을 수 있습니다 .

OBJECTPROPERTY 함수는 다음 서명을 사용합니다.

OBJECTPROPERTY ( id , property ) 

찾고자하는 객체의 유형을 지정하여 리터럴 값을 속성 매개 변수에 전달합니다. 제공 할 수있는 방대한 값 목록이 있습니다.


완전한 if / drop 예제가 포함되어 있으면이 답변의 단순함을 쉽게 볼 수 있다고 생각합니다.
Jonathan

6

이 스레드가 오래되었다는 것을 알고 있지만 and Alter보다 안전하다고 생각하는 사람들을 위해이 답변을 추가하고 싶었습니다 . 아래의 것입니다 존재하는 경우 또는 그것을하지 않는 경우 :DropCreateAlterFunctionCreate

  IF NOT EXISTS (SELECT *
               FROM   sys.objects
               WHERE  object_id = OBJECT_ID(N'[dbo].[foo]')
                      AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' ))
       EXEC('CREATE FUNCTION [dbo].[foo]() RETURNS INT AS BEGIN RETURN 0 END')
  GO
  ALTER FUNCTION [dbo].[foo]
  AS
  ...

2
나는 이것을 좋아하지만 "ALTER FUNCTION"이어야한다고 생각하지 않습니까?
Erik

내가 좋아ALTER OR CREATE
AgentFire
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.