Ich weiß, dass dies einfach sein muss, aber wie stelle ich die Erstellung einer Funktion mit einem Check vor, um zu sehen, ob es bereits existiert? Wenn es existiert, möchte ich es fallen lassen und neu erstellen.Wie kann ich eine Funktion löschen, wenn sie bereits existiert?
Antwort
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
Wenn Sie verwenden müssen Möchten Sie die sys * -Tabellen vermeiden, können Sie stattdessen (von here in Beispiel A):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
Die Hauptsache zu fangen ist, welche Art von Funktion, die Sie versuchen, zu löschen (in der oberen SQL bezeichnet mit FN, IF und TF):
- FN = Skalarfunktion
- IF = inlined Tabelle Funktion
- TF = Tabelle Funktion
if object_id('FUNCTION_NAME') is not NULL
DROP FUNCTION <name>
Sie auch den Namen
IF EXISTS (SELECT *
FROM sysobjects
WHERE name='<function name>' and xtype='FN'
Eigentlich in sysobjects nach oben schauen können, wenn die Funktion eine Tabelle Funktion sein könnte, Sie
xtype in ('FN','TF')
ich schrecken in der Regel weg von Anfragen von sys * Typ Tabellen, neigen Anbieter diese zwischen den Versionen zu ändern, major oder anderweitig. Was ich immer gemacht habe, ist, die DROP FUNCTION <name>
Anweisung herauszugeben und sich nicht um irgendwelche SQL Fehler zu sorgen, die zurückkommen könnten. Ich betrachte diese Standardprozedur im DBA-Bereich.
sys. in SQL Server 2005 ist der offizielle Weg. Sie sind * Ansichten * nicht Tabellen heutzutage und die tatsächlichen sys Tabellen sind von uns verborgen. – gbn
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
Dies funktioniert für jedes Objekt, nicht nur Funktionen:
IF OBJECT_ID('YourObjectName') IS NOT NULL
dann nur Ihren Geschmack des Objekts hinzufügen, wie in:
IF OBJECT_ID('YourFunction') IS NOT NULL
DROP FUNCTION YourFunction
GO
IF EXISTS
(SELECT *
FROM schema.sys.objects
WHERE name = 'func_name')
DROP FUNCTION [dbo].[func_name]
GO
Dies fügt den bereits vorhandenen Antworten nichts hinzu. – TZHX
Von SQL Server 2016 CTP3
Sie kann neue DIE Stateme verwenden nts statt großer IF
Wrapper
Syntax:
DROP FUNCTION [IF EXISTS] {[schema_name. function_name]} [, ... n ]
Abfrage:
DROP Function IF EXISTS udf_name
Mehr Infos here
Hier ist mein nehmen auf diesem:
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;
Sie zwei Möglichkeiten um die Prozedur in SQL Server 2016 zu löschen und neu zu erstellen.
Ausgehend von SQL Server 2016 - verwenden "IF exists"
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]
[;]
Ausgehend von SQL Server 2016 SP1 - Verwendung "OR ALTER"
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
Check For Funktion existieren, wenn
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
Überprüfen Sie, ob Exist für Stored procedure, Funktion auch durch Klicken auf den folgenden Link http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
Wenn Sie die SQL-ISO-Standard INFORMATION_SCHEMA und nicht die SQL Server-spezifische sysobjects
verwenden möchten, können Sie dies tun:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO
Hey danke, ich wusste nicht object_id hatte einen zweiten Parameter für den Objekttyp – Sparky
gegebenen Objektnamen (die in sys.objects erscheinen) Um eindeutig zu sein, ist die Abfrage von xtype redundant. Versuchen Sie, eine Tabelle und eine gespeicherte Prozedur mit dem gleichen Namen zu erstellen ... – gbn