Ceci est plus spécifique à MS SQL (> 2008, mais surtout agnostique de version).
Je cherche à simplifier la vérification d'une procédure stockée dans SQL Server. Ce que je voudrais finir avec quelque chose comme ceci:
IF (dbo.PROC_EXISTS(N'MY_STORED_PROC_NAME') = 1) DROP PROCEDURE MY_STORED_PROC_NAME GO
Ce que j'ai actuellement:
SELECT CAST( CASE WHEN EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'GET_ALT_SCHEDULE') AND type IN (N'P', N'PC') ) THEN 'TRUE' ELSE 'FALSE' END AS BIT ) RETURNS 1 -- TRUE RETURNS 0 -- FALSE
Lorsque je place ce code dans une fonction, cela ne fonctionne pas car je ne peux pas renvoyer une valeur provenant d'une instruction select.
CREATE FUNCTION PROC_EXISTS(@SPName NVARCHAR) RETURNS BIT AS BEGIN DECLARE @Answer BIT SET @Answer = SELECT -- Incorrect syntax near 'SELECT' CAST( CASE WHEN EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@SPName) AND type IN (N'P', N'PC') ) THEN 1 ELSE 0 END AS BIT ) RETURN @Answer END
Quelqu'un pourrait-il donner un aperçu de ce qui se passe? et si vous pouvez une solution à la façon dont cette fonction pourrait être composée pour returnner ce que je cherche (selon le premier bloc de code)
Ou peut-être qu'une fonction n'est pas appropriée pour ce scénario. Mais veuillez indiquer pourquoi.
Que diriez-vous d'utiliser object_id()
?
if object_id(N'dbo.proc_name') is not null drop procedure dbo.proc_name;
Pour corriger votre code de fonction:
Votre input est spécifiée en tant que nvarchar
sans taille, donc par défaut, elle vaut 1. Changez-la en sysname
place.
Enlevez select
que vous utilisez déjà. Alternativement, vous pouvez supprimer set
et utiliser select @Answer = cast ...
create function proc_exists (@spname sysname) returns bit as begin; declare @Answer bit; set @Answer = case when exists ( select * from sys.objects where object_id = object_id(@spname) and type in (N'P', N'PC') ) then 1 else 0 end; return @Answer; end; go
rextester demo: http://rextester.com/EYWVBY20177