如果T-SQL中存在不起作用,则删除并重新创建过程

Sta*_*ace 11 t-sql sql-server stored-procedures

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
Run Code Online (Sandbox Code Playgroud)

我有上面的代码来检查当前数据库中是否存在存储过程LOCATION.我希望它会丢弃并重新创建程序(如果存在).

但是,如果该过程存在,则代码仍在执行,因此我收到以下错误:"数据库中已存在名为"LOCATION"的对象.

为什么该代码如果存在则无法删除该程序?

相同的代码适用于同一数据库中的另一个过程.

Pரத*_*ீப் 12

试试这个(使用视图的首选方法):

IF EXISTS(SELECT 1
          FROM   INFORMATION_SCHEMA.ROUTINES
          WHERE  ROUTINE_NAME = 'PRC_NAME'
                 AND SPECIFIC_SCHEMA = 'schema_name')
  BEGIN
      DROP PROCEDURE PRC_NAME
  END
Run Code Online (Sandbox Code Playgroud)

或者这个(不推荐使用直接访问系统表):

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
Run Code Online (Sandbox Code Playgroud)

为什么第一种方法是首选的,你可以在这个问题中找到:SQL Server:我应该在sys表上使用information_schema表吗?


Qbe*_*ben 11

这有点晚了,但是最终在这里的其他人可能想查看一下你可以使用的MSDN文档:

DROP PROCEDURE IF EXISTS dbo.uspMyProc;
GO
Run Code Online (Sandbox Code Playgroud)

但是,这可以从SQL Server 2016社区技术预览版3.3(CTP 3.3)获得.


n34*_*nda 8

你可以使用:

IF OBJECT_ID('MSL_GET_IP_LOCATION', 'P') IS NOT NULL
  DROP PROCEDURE MSL_GET_IP_LOCATION
GO
Run Code Online (Sandbox Code Playgroud)

进一步考虑这一点,你需要确保所有对象都有唯一的名称.