queries - tsql from
¿Cómo elimino una función si ya existe? (11)
Aquí está mi opinión sobre esto:
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;
Sé que esto debe ser simple, pero ¿cómo introduzco la creación de una función con un control para ver si ya existe? Si existe, quiero soltarlo y volverlo a crear.
Compruebe si existe para la función
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
Compruebe si existe para el procedimiento almacenado, también la función haciendo clic en el enlace a continuación http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
Desde SQL Server 2016 CTP3
puede usar nuevas sentencias DIE en lugar de grandes contenedores IF
Sintaxis:
DROP FUNCTION [IF EXISTS] {[schema_name. ] function_name} [, ... n]
Consulta:
DROP Function IF EXISTS udf_name
Más información here
Esto funciona para cualquier objeto, no solo funciones:
IF OBJECT_ID(''YourObjectName'') IS NOT NULL
entonces simplemente agrega tu sabor de objeto, como en:
IF OBJECT_ID(''YourFunction'') IS NOT NULL
DROP FUNCTION YourFunction
GO
Por lo general, evito las consultas de las tablas de tipo sys *, los proveedores tienden a cambiarlas entre versiones, principales o de otro tipo. Lo que siempre he hecho es emitir la declaración DROP FUNCTION <name>
y no preocuparme por ningún error de SQL que pueda aparecer. Considero que el procedimiento estándar en el reino DBA.
Si desea utilizar el estándar ISO de SQL INFORMATION_SCHEMA y no los sysobjects
específicos de SQL Server, puede hacer esto:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N''FunctionName''
)
DROP FUNCTION [dbo].[FunctionName]
GO
Tiene dos opciones para descartar y volver a crear el procedimiento en SQL Server 2016.
A partir de SQL Server 2016: use "SI EXISTE"
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]
[;]
A partir de SQL Server 2016 SP1: use "O ALTERA"
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
IF EXISTS
(SELECT *
FROM schema.sys.objects
WHERE name = ''func_name'')
DROP FUNCTION [dbo].[func_name]
GO
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 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
Si desea evitar las tablas sys *, podría hacerlo (de here en el ejemplo A):
IF object_id(N''function_name'', N''FN'') IS NOT NULL
DROP FUNCTION function_name
GO
Lo principal que debe detectar es qué tipo de función está intentando eliminar (indicada en el sql superior por FN, IF y TF):
- FN = Función escalar
- IF = Función de tabla en línea
- TF = Función de tabla
if object_id(''FUNCTION_NAME'') is not NULL
DROP FUNCTION <name>
También puede buscar el nombre en sysobjects
IF EXISTS (SELECT *
FROM sysobjects
WHERE name=''<function name>'' and xtype=''FN''
En realidad, si la función puede ser una función de tabla, debe usar
xtype in (''FN'',''TF'')