Bit de return dans UDF

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