IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'LOCATION') AND type IN (N'P', N'PC'))
DROP PROCEDURE [dbo].[LOCATION]
GO
CREATE PROCEDURE [dbo].[LOCATION]
@IP NVARCHAR(100)
AS
BEGIN
DECLARE @IPNumber BIGINT
SELECT @IPNumber = dbo.ConvertIp2Num(@IP)
SELECT [country_code],[country_name]
FROM [myDatabase].[dbo].[CountryIP]
WHERE @IPNumber BETWEEN ip_from AND ip_to
END
J'ai le code ci-dessus pour vérifier si la procédure stockée LOCATION existe dans la base de données actuelle. Je m'attends à ce qu'il baisse et recrée la procédure si elle existe.
Cependant, si la procédure existe, le code est toujours en cours d'exécution et, par conséquent, j'obtiens l'erreur suivante "Il existe déjà un objet nommé" LOCATION "dans la base de données."
Pourquoi ce code ne parvient-il pas à supprimer la procédure si elle existe?
Le même code fonctionne correctement pour une autre procédure dans la même base de données.
Essayez ceci (méthode préférée en utilisant une vue):
IF EXISTS(SELECT 1
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME = 'PRC_NAME'
AND SPECIFIC_SCHEMA = 'schema_name')
BEGIN
DROP PROCEDURE PRC_NAME
END
ou ceci (déconseillé d'utiliser un accès direct à une table système):
IF EXISTS (SELECT 1
FROM SYS.PROCEDURES
WHERE NAME = 'PRC_NAME'
AND SCHEMA_NAME(SCHEMA_ID) = 'SCHEMA_NAME'
AND [TYPE] IN (N'P',N'PC'))
BEGIN
DROP PROCEDURE PRC_NAME
END
Pourquoi la première méthode est préférée, vous pouvez découvrir par exemple dans cette question: SQL Server: dois-je utiliser les tables information_schema sur les tables sys?
C'est un peu tard, mais d'autres qui finissent ici voudront peut-être consulter la documentation MSDN qui dit que vous pouvez utiliser:
DROP PROCEDURE IF EXISTS dbo.uspMyProc;
GO
Ceci est cependant disponible à partir de l'aperçu de la technologie communautaire de SQL Server 2016 3.3 (CTP 3.3).
Vous pouvez utiliser:
IF OBJECT_ID('MSL_GET_IP_LOCATION', 'P') IS NOT NULL
DROP PROCEDURE MSL_GET_IP_LOCATION
GO
Plus loin, vous devrez vous assurer que vous avez des noms uniques sur tous les objets.