Sé que esto debe ser simple, pero ¿cómo introduzco la creación de una función con una comprobación para ver si ya existe? Si existe, quiero soltarlo y volverlo a crear.¿Cómo elimino una función si ya existe?
Respuesta
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 *, en su lugar podría hacer (desde here en el ejemplo A):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
Lo principal para coger es qué tipo de función que está intentando eliminar (denotado en el sql superior por FN, IF y TF):
- FN = función escalar
- SI = inline Tabla de funciones
- TF = Tabla de funciones
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 podría ser una función de tabla, es necesario utilizar
xtype in ('FN','TF')
lo general asusto de consultas de tablas de tipo sys *, los vendedores tienden a cambiar estos términos 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 SQL que pueda surgir. Considero que el procedimiento estándar en el reino DBA.
sys. en SQL Server 2005 es la forma oficial. Son * vistas * no tablas hoy en día y las tablas sys reales están ocultas de nosotros. – 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
Esto funciona para cualquier objeto, no sólo funciones:
IF OBJECT_ID('YourObjectName') IS NOT NULL
continuación, basta con añadir su sabor del objeto, como en:
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
Esto no agrega nada a las respuestas ya existentes. – TZHX
De SQL Server 2016 CTP3
se puede usar el nuevo DIE stateme NTS en lugar de grandes IF
envoltorios
Sintaxis:
DROP FUNCIÓN [SI EXISTE] {[schema_name. ] Function_name} [, ... n ]
Consulta:
DROP Function IF EXISTS udf_name
Más información here
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;
Usted tiene dos opciones para quitar y volver a crear el procedimiento en SQL Server 2016.
A partir de SQL Server 2016 - utilice "si existe"
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]
[;]
A partir de SQL Server 2016 SP1 - Uso "o ALTER"
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
Comprobar si existen 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, función también haciendo clic en el enlace de abajo http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
Si desea utilizar el INFORMATION_SCHEMA norma ISO SQL y no el SQL sysobjects
específica del servidor, se puede hacer esto:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO
- 1. Crear una cookie si (y sólo si) no existe ya
- 2. cómo comprobar si el objeto ya existe en una lista
- 3. NSMutableArray compruebe si el objeto ya existe
- 4. cheque si el valor ya existe
- 5. Comprobar si un evento ya existe
- 6. Clojure: determine si existe una función
- 7. Mimic File.Move si el destino ya existe
- 8. ¿Cómo verificar una DLL si existe una función?
- 9. Determine si existe una función en bash
- 10. ¿Ya existe una función Zip condicional en C#?
- 11. ¿Cómo elimino una función de Bash?
- 12. ¿Cómo verificar si ya existe un valor para evitar duplicados?
- 13. Cómo detectar si ya existe un procedimiento almacenado
- 14. ¿Cómo INSERTAR un registro o ACTUALIZAR si ya existe?
- 15. ¿Cómo comprobar si el directorio ya existe en MFC (VC++)?
- 16. ¿Existe una manera eficiente de crear una lista o anexarla si ya existe?
- 17. Cómo agregar o eliminar (si ya existe) un par clave => valor a una matriz?
- 18. Compruebe si existe una función desde un script bash
- 19. PHP mkdir() Función - Si la carpeta existe
- 20. ¿Cómo verificar si ya existe un objeto con una ID en la página?
- 21. ¿Cómo elimino una restricción de clave externa solo si existe en el servidor sql?
- 22. JavaScript window.open only si la ventana ya no existe
- 23. inserción SQL condicional si la fila no existe ya
- 24. Django: compruebe si ya existe un objeto antes de agregar
- 25. SqlAlchemy: crea un objeto si no existe ya?
- 26. MongoDB Insertar campo de documento existente si ya no existe
- 27. comprobar si un usuario ya existe en Drupal
- 28. Planteando excepciones cuando ya existe una excepción en Python 3
- 29. Crear tabla en SQLite solo si ya no existe
- 30. Boost MPL: Llame a una función (miembro) solo si existe
Oye, gracias, no sabía que Object_id tenía un segundo parámetro para el tipo de objeto – Sparky
nombres de objeto dados (que aparecen en sys.objects) para ser único, consultar xtype es redundante. Intente crear una tabla y un proceso almacenado con el mismo nombre ... – gbn