Как я отбрасываю функцию, если она уже существует?

Я знаю, что это должно быть просто, но как я снабжаю создание предисловием функции с проверкой, чтобы видеть, существует ли оно уже? Если это существует, я хочу отбросить и воссоздать его.

93
задан Jon Seigel 17 May 2010 в 02:49
поделиться

4 ответа

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):

  • FN = Скалярная функция
  • IF = Встроенная табличная функция
  • TF = Табличная функция
175
ответ дан 24 November 2019 в 06:14
поделиться
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
5
ответ дан 24 November 2019 в 06:14
поделиться
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')
22
ответ дан 24 November 2019 в 06:14
поделиться

Я обычно избегаю запросов из таблиц типов sys *, поставщики обычно меняют их между выпусками, основными или другими. Что я всегда делал, так это выдавал оператор DROP FUNCTION и не беспокоился о каких-либо ошибках SQL, которые могут появиться снова. Я считаю эту процедуру стандартной в области DBA.

2
ответ дан 24 November 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: