Як я скидаю функцію, якщо вона вже існує?


101

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

Відповіді:


187
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 = Функція таблиці

Ей, дякую, я не знав, що у Object_id був другий параметр для типу об’єкта
Sparky

1
задані імена об’єктів (які відображаються в sys.objects) повинні бути унікальними, запит на xtype є зайвим. Спробуйте створити таблицю та збережений примірник з тим самим назвою ...
gbn

22
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')

2
Я завжди віддав перевагу методу Object_id, читати його в коді здається більш простим. Завжди цікаво, чому згенерований зразком код Microsoft використовує пошук sys.objects замість ...
Sparky

12

Це працює для будь-якого об’єкта, а не лише для функцій:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

тоді просто додайте аромат об'єкта, як у:

IF OBJECT_ID('YourFunction') IS NOT NULL
   DROP FUNCTION YourFunction

11

У вас є два варіанти скинути та відтворити процедуру в SQL Server 2016.

Починаючи з SQL Server 2016 - використовуйте IF EXISTS

DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]   [;]

Починаючи з SQL Server 2016 SP1 - використовуйте OR ALTER

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   


2

Я зазвичай ухиляюся від запитів таблиць типу sys *, постачальники, як правило, змінюють їх між випусками, основними чи іншими. Те, що я завжди робив - це видавати DROP FUNCTION <name>заяву і не турбуватися про будь-яку помилку SQL, яка може повернутися. Я вважаю, що стандартна процедура у царині DBA.


1
сис. в SQL Server 2005 - це офіційний шлях. Нині це погляди, а не таблиці, а фактичні таблиці sys приховані від нас.
gbn

2

З SQL Server 2016 CTP3ви можете використовувати нові DIE заяви замість великих IFобгорток

Синтаксис:

ФУНКЦІЯ ДРОПУВАННЯ [ЯКЩО існує] {[схема_назва. ] function_name} [, ... n]

Запит:

DROP Function IF EXISTS udf_name

Більше інформації тут


0
IF EXISTS
      (SELECT * 
      FROM schema.sys.objects
      WHERE name = 'func_name')
    DROP FUNCTION [dbo].[func_name]
GO

0

Ось мій погляд на це:

if(object_id(N'[dbo].[fn_Nth_Pos]', N'FN')) is not null
    drop function [dbo].[fn_Nth_Pos];
GO
CREATE FUNCTION [dbo].[fn_Nth_Pos]
(
    @find char, --char to find
    @search varchar(max), --string to process   
    @nth int --occurrence   
)
RETURNS int
AS
BEGIN
    declare @pos int --position of nth occurrence
    --init
    set @pos = 0

    while(@nth > 0)
    begin       
        set @pos = charindex(@find,@search,@pos+1)
        set @nth = @nth - 1
    end 

    return @pos
END
GO

--EXAMPLE
declare @files table(name varchar(max));

insert into @files(name) values('abc_1_2_3_4.gif');
insert into @files(name) values('zzz_12_3_3_45.gif');

select
    f.name,
    dbo.fn_Nth_Pos('_', f.name, 1) as [1st],
    dbo.fn_Nth_Pos('_', f.name, 2) as [2nd],
    dbo.fn_Nth_Pos('_', f.name, 3) as [3rd],
    dbo.fn_Nth_Pos('_', f.name, 4) as [4th]
from 
    @files f;

0

Перевірте, чи існує функція

 IF  EXISTS (SELECT TOP 1 1 FROM sys.objects WHERE 
        object_id = OBJECT_ID(N'[Schema].[function_Name]')
         AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
BEGIN
DROP FUNCTION [Schema].[function_Name]
Print('function dropped => [Schema].[function_Name]')
END
GO

Перевірте, чи існує ІС на наявність збереженої процедури, функція також, натиснувши посилання нижче http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html


0

Якщо ви хочете використовувати стандарт SQL ISO INFORMATION_SCHEMA, а не специфічний для SQL Server sysobjects, ви можете зробити це:

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.