web-dev-qa-db-fra.com

Supprimez et recréez la procédure si elle existe dans T-SQL ne fonctionne pas

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.

11
StackTrace

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?

12
Pரதீப்

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).

11
Qben

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.

8
n34_panda