programing

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

mailnote 2023. 4. 16. 15:30
반응형

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

데이터베이스에 함수가 존재하는지 확인해야 해당 함수를 삭제하고 다시 만들 수 있습니다.기본적으로 저장 프로시저에 사용하는 다음과 같은 코드여야 합니다.

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

이것은 SSMS가 다음 명령어를 사용하여 스크립팅할 때 사용하는 것입니다.DROP and CREATE선택

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는 옵션이지만 올바른 오브젝트를 식별하는 데 도움이 됩니다.이 type 인수에는 많은 값이 있습니다.특히 다음과 같습니다.

  • FN : 스칼라 함수
  • IF : 인라인 테이블 값 함수
  • TF : 테이블 값 함수
  • FS: 어셈블리(CLR) 스칼라 기능
  • FT : 어셈블리(CLR) 테이블 값 함수
  • U : 테이블(사용자 정의)

오래됐다는 건 알지만 이 대답을 덧붙이고 싶었어요Alter보다Drop그리고.Create아래는AlterFunction존재하는 경우 또는Create그렇지 않은 경우:

  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
  ...

다음과 같이 다양한 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+에서 사용할 수 있는 OBJECT PROPERTY 함수를 기반으로 합니다.MSDN 기사는 여기에서 찾을 수 있습니다.

OBJECT PROPERTY 함수는 다음 시그니처를 사용합니다.

OBJECTPROPERTY ( id , property ) 

검색할 개체 유형을 지정하는 리터럴 값을 속성 매개 변수로 전달합니다.제공할 수 있는 가치의 방대한 목록이 있습니다.

SQL Server 2016 SP1, SQL Server 2017 이상부터는 다음 구문을 사용할 수 있습니다.

CREATE OR ALTER [object] ...

이 고리를 뛰어넘는 걸 피하려고요.이 방법에는 (변경할 때마다 새로운 오브젝트 ID를 얻는 것이 아니라) 유지 중인 프로시저에 대한 메타데이터의 추가적인 이점이 있습니다.이는 특히 오브젝트 ID를 신경 쓰는 Query Store나 기타 도구를 사용하는 경우 유용합니다.

언급URL : https://stackoverflow.com/questions/5419082/how-to-check-if-a-function-exists-in-a-sql-database

반응형