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


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

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

5 ответов:

это то, что 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') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[YourFunctionName]
END
GO

по крайней мере это работает для меня..

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

вы передаете литеральное значение в параметр свойства, обозначая тип объекта, который вы ищем. Есть огромный список ценностей, которые вы можете предоставить.

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