transact queries from for condiciones tsql sql-server-2000

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