Как проверить, существует ли функция в базе данных SQL
Мне нужно выяснить, существует ли функция в базе данных, чтобы я мог удалить ее и создать ее снова. Это должно быть что-то вроде следующего кода, который я использую для хранимых процедур:
IF EXISTS (
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[SP_TEST]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
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 )
вы передаете литеральное значение в параметр property, обозначая тип объекта, который вы ищем. Существует огромный список ценностей, которые вы можете предоставить.
Я знаю, что эта тема старая, но я просто хотел добавить этот ответ для тех, кто считает, что безопаснее 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
...