Я знаю, что это должно быть просто, но как я снабжаю создание предисловием функции с проверкой, чтобы видеть, существует ли оно уже? Если это существует, я хочу отбросить и воссоздать его.
IF EXISTS (
SELECT * FROM sysobjects WHERE id = object_id(N'function_name')
AND xtype IN (N'FN', N'IF', N'TF')
)
DROP FUNCTION function_name
GO
Если вы хотите избежать использования таблиц sys *, вы можете вместо этого сделать (из здесь в примере A):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
Главное, что нужно уловить, это какой тип функции вы пытаетесь удалить (обозначена в верхнем sql как FN, IF и TF):
IF EXISTS
(SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'functionName')
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION functionName
GO
if object_id('FUNCTION_NAME') is not NULL
DROP FUNCTION <name>
Вы также можете найти имя в sysobjects
IF EXISTS (SELECT *
FROM sysobjects
WHERE name='<function name>' and xtype='FN'
На самом деле, если функция может быть табличной функцией, вам нужно использовать
xtype in ('FN','TF')
Я обычно избегаю запросов из таблиц типов sys *, поставщики обычно меняют их между выпусками, основными или другими. Что я всегда делал, так это выдавал оператор DROP FUNCTION
и не беспокоился о каких-либо ошибках SQL, которые могут появиться снова. Я считаю эту процедуру стандартной в области DBA.