Как проверить, существует ли функция в базе данных SQL

Мне нужно выяснить, существует ли функция в базе данных, чтобы я мог ее удалить и создать снова. В основном это должно быть что-то вроде следующего кода, который я использую для хранимых процедур:

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

Ответ 1

Это то, что SSMS использует, когда вы script с помощью опции 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, если Exists вместо этого.

Ответ 2

Я использую 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' ) 

Ответ 3

Почему не просто

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

Второй аргумент object_id является необязательным, но может помочь определить правильный объект. Возможные значения для типа:

  • FN: скалярная функция
  • IF: встроенная табличная функция
  • TF: табличная функция
  • Скалярная функция FS: Assembly (CLR)
  • FT: Сборочная (CLR) табличная функция

Ответ 4

Я обнаружил, что вы можете использовать очень необоснованный и простой подход к проверке существования различных объектов 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

Это основано на функции OBJECTPROPERTY, доступной в SQL 2005+. В статье MSDN можно найти здесь.

Функция OBJECTPROPERTY использует следующую подпись:

OBJECTPROPERTY ( id , property ) 

Вы передаете буквальное значение в параметр свойства, обозначающий тип объекта, который вы ищете. Там массивный список значений, которые вы можете предоставить.

Ответ 5

Я знаю, что эта ветка старая, но я просто хотел добавить этот ответ для тех, кто считает, что безопаснее Alter чем Drop и Create. Ниже будет Alter на Function, если она существует, или 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
  ...