Je sais que cela doit être simple, mais comment puis-je préfacer la création d'une fonction avec une vérification pour voir si elle existe déjà? Si cela existe, je veux le laisser tomber et le recréer.Comment abandonner une fonction si elle existe déjà?
Répondre
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 vous voulez éviter les tables sys *, vous pouvez faire à la place (à partir de here dans l'exemple A):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
La principale chose à attraper est ce type de fonction que vous essayez de supprimer (notée dans le sql haut par FN, IF et TF):
- FN = Scalar Fonction
- IF = inline Tableau Fonction
- TF = Fonction Tableau
if object_id('FUNCTION_NAME') is not NULL
DROP FUNCTION <name>
Vous pouvez également regarder le nom dans sysobjects
IF EXISTS (SELECT *
FROM sysobjects
WHERE name='<function name>' and xtype='FN'
En fait, si la fonction pourrait être une fonction de table, vous devez utiliser
xtype in ('FN','TF')
Je timide habituellement loin de requêtes de tables de type sys *, les vendeurs ont tendance à changer ces entre les versions, majeures ou autrement. Ce que j'ai toujours fait est d'émettre l'instruction DROP FUNCTION <name>
et ne pas se soucier de toute erreur SQL qui pourrait revenir. Je considère cette procédure standard dans le domaine DBA.
sys. dans SQL Server 2005 est la manière officielle. Ils sont * vues * pas des tables de nos jours et les tables sys réels sont cachés de nous. – 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
Cela fonctionne pour tout objet, non seulement les fonctions:
IF OBJECT_ID('YourObjectName') IS NOT NULL
ajoutez simplement votre goût de l'objet, comme dans:
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
Cela n'ajoute rien aux réponses déjà existantes. – TZHX
De SQL Server 2016 CTP3
vous peut utiliser nouveau DIE stateme nts au lieu des grandes IF
emballages
Syntaxe:
FONCTION DROP [IF EXISTS] {[schema_name. ] Nom_fonction} [, ... n ]
Requête:
DROP Function IF EXISTS udf_name
Plus d'info here
Voici mon avis sur ceci:
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;
Vous avez deux options pour supprimer et recréer la procédure dans SQL Server 2016.
A partir de SQL Server 2016 - utiliser "IF EXISTS"
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]
[;]
A partir de SQL Server 2016 SP1 - l'utilisation "OU TRANSFORMER"
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
Vérifiez si elles existent pour la fonction
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
Vérifiez IF Existe pour la procédure stockée, Fonctionne également en cliquant sur le lien ci-dessous http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
Si vous voulez utiliser l'INFORMATION_SCHEMA SQL standard ISO et non la vous pouvez faire spécifiques à SQL Server sysobjects
, ceci:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO
- 1. Vérifier si une relation d'ami existe déjà
- 2. MySQL: Comment ajouter une colonne si elle n'existe pas déjà?
- 3. Comment détecter si une procédure stockée existe déjà
- 4. comment vérifier si l'objet existe déjà dans une liste
- 5. php - Détermine si une image existe et si elle l'affiche
- 6. Tronquer une table SQLite si elle existe?
- 7. Déposer une vue DB2 si elle existe
- 8. seulement insérer une ligne si elle est pas déjà
- 9. Comment abandonner une macro
- 10. Comment utiliser wikipedia api si elle existe?
- 11. ANSI SQL question - comment insérer ou mettre à jour un dossier si elle existe déjà?
- 12. comment vérifier si un élément existe déjà dans le tableau
- 13. Comment annuler la sortie si $^I = ".bak" existe déjà?
- 14. Comment tester si un répertoire existe déjà en PHP?
- 15. Comment créer une catégorie dans WordPress par programmation si elle n'existe pas déjà?
- 16. Comment effectuer une action sur une colonne gridview uniquement si elle existe?
- 17. Lancer une activité à partir de la barre d'état crée une nouvelle activité même si elle existe déjà
- 18. C#/WPF: Ajouter Window.Style, même si un ResourceDictionary existe déjà
- 19. Comment vérifier si une fonction javascript existe de silverlight
- 20. Comment tester si une chaîne existe dans un flux Genshi?
- 21. Une telle procédure existe-t-elle dans une norme Scheme et si oui, comment s'appelle-t-elle?
- 22. javascript existe déjà
- 23. Comment abandonner l'impression?
- 24. Table de sauvegarde MySQL si elle existe
- 25. Ruby: comment définir une variable à 0 ou, si elle est déjà définie, incrémenter de 1
- 26. Comment créer une page dans WordPress par programmation si elle n'existe pas déjà?
- 27. affiche un message si le nom de fichier existe déjà
- 28. CodeIgniter - Vérification pour voir si une valeur existe déjà dans la base de données
- 29. Comment puis-je abandonner une installation InstallShield en fonction d'un résultat d'action personnalisée de vbscript?
- 30. Arrêter d'insérer dans la table si l'enregistrement existe déjà
Hey merci, je ne savais pas Object_id avait un deuxième paramètre pour le type d'objet – Sparky
noms d'objets donnés (qui apparaissent dans sys.objects) ont Pour être unique, l'interrogation de xtype est redondante. Essayez de créer une table et un proc enregistré avec le même nom ... – gbn