Programing

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

lottogame 2020. 7. 7. 07:40
반응형

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


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

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

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을 고려할 수 있습니다 .


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

왜 그냥 :

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

두 번째 인수 object_id는 선택 사항이지만 올바른 개체를 식별하는 데 도움이 될 수 있습니다. 유형에 가능한 값은 다음과 같습니다.

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

이 방법으로 다양한 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 ) 

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


이 스레드가 오래되었다는 것을 알고 있지만 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
  ...

참고URL : https://stackoverflow.com/questions/5419082/how-to-check-if-a-function-exists-on-a-sql-database

반응형