Как проверить, существует ли функция в базе данных 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
...