Jak mogę zrezygnować z funkcji, jeśli już istnieje?

Wiem, że to musi być proste, ale w jaki sposób utworzyć funkcję sprawdzając, czy już istnieje? Jeśli istnieje, chcę go upuścić i odtworzyć.

Author: Jon Seigel, 2010-02-18

11 answers

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

Jeśli chcesz uniknąć tabel sys*, możesz zamiast tego zrobić (z TUTAJ w przykładzie A):

IF object_id(N'function_name', N'FN') IS NOT NULL
    DROP FUNCTION function_name
GO

Najważniejsze jest to, jaki typ funkcji próbujesz usunąć (oznaczony w górnym sql przez FN, IF I TF):

  • FN = funkcja skalarna
  • IF = Inlined Table Function
  • TF = Funkcja tabeli
 161
Author: adrianbanks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 17:46:57
if object_id('FUNCTION_NAME') is not NULL
   DROP FUNCTION <name>

Możesz również wyszukać nazwę w obiektach sysobjects

IF EXISTS (SELECT * 
       FROM   sysobjects 
           WHERE name='<function name>' and xtype='FN'

Właściwie, jeśli funkcja może być funkcją tabelkową, musisz użyć

xtype in ('FN','TF')
 20
Author: Sparky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 17:39:54

To działa dla dowolnego obiektu, a nie tylko funkcji:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

Następnie po prostu dodaj swój smak obiektu, jak w:

IF OBJECT_ID('YourFunction') IS NOT NULL
   DROP FUNCTION YourFunction
 8
Author: Metaphor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 18:53:15
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
Author: Fiona - myaccessible.website,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 17:46:10

Masz dwie opcje, aby upuścić i odtworzyć procedurę w SQL Server 2016.

Począwszy od SQL Server 2016-użyj "JEŚLI ISTNIEJE"

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

Począwszy od SQL Server 2016 SP1-Użyj "lub ALTER"

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
 5
Author: Konrad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 07:47:55

Zwykle unikam zapytań z tabel typu sys*, dostawcy mają tendencję do zmiany tych pomiędzy wydaniami, głównych lub innych. To, co zawsze robiłem, to wydawanie DROP FUNCTION <name> instrukcji i nie martwić się o jakikolwiek błąd SQL, który może wrócić. Uważam, że to standardowa procedura w sferze DBA.

 2
Author: Jeff Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 17:42:54
IF EXISTS
      (SELECT * 
      FROM schema.sys.objects
      WHERE name = 'func_name')
    DROP FUNCTION [dbo].[func_name]
GO
 0
Author: user2419223,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-01 15:37:45

Z SQL Server 2016 CTP3 możesz użyć nowychDIE zamiast dużych IF wrapperów

Składnia:

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

Zapytanie:

DROP Function IF EXISTS udf_name

Więcej informacji proszę.

 0
Author: Pரதீப்,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-22 15:04:19

Oto moje zdanie na ten temat:

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
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 19:59:57

Sprawdź, czy istnieje dla funkcji

 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

Sprawdź, czy istnieją dla procedury składowanej , Uruchom również klikając poniższy link http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html

 0
Author: Jatin Phulera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-21 10:46:26

Jeśli chcesz użyć standardu SQL ISO INFORMATION_SCHEMA, a nie specyficznego dla serwera SQL sysobjects, możesz to zrobić:

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
 0
Author: Ed Greaves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-14 16:45:56