Как проверить, существует ли функция в базе данных SQL - PullRequest
122 голосов
/ 24 марта 2011

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

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

Ответы [ 5 ]

186 голосов
/ 24 марта 2011

Это то, что 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 если существует вместо

56 голосов
/ 22 сентября 2011

Я склонен использовать 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' ) 
28 голосов
/ 21 сентября 2015

Почему бы просто:

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

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

  • FN: скалярная функция
  • IF: встроенная табличная функция
  • TF: табличная функция
  • FS: скалярная функция сборки (CLR)
  • FT: табличная функция сборки (CLR)
9 голосов
/ 14 февраля 2015

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

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