【问题标题】:Stored Procedure Does and Does Not Exist存储过程存在和不存在
【发布时间】:2013-07-09 11:46:54
【问题描述】:

我有一个 SQL Server 2008 R2 数据库,其中包含一个可能存在也可能不存在的存储过程。

如果我运行sp_help spThing,它会返回一行,就好像它存在一样(名称:spThing,所有者:dbo,类型:存储过程)。

如果我尝试创建具有相同名称的新存储过程,我会收到错误消息“数据库中已经有一个名为 'spThing' 的对象”。

但是

如果我运行SELECT OBJECT_ID('dbo.spThing'),它返回NULL。

如果我运行 EXEC spThing,它会显示“找不到存储过程 'spThing'”。

如果我运行 DROP spThing,它会显示“无法删除过程 'spThing',因为它不存在或您没有权限”。

如果我运行SELECT * FROM sys.objects WHERE name = 'spThing',我没有行。

如果我运行SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'spThing',我没有行。

所有这些都是以管理用户身份从同一个连接运行的。

存储过程是否存在?

编辑:

SP 本身是一个微不足道的选择,大致如下:

CREATE PROCEDURE spThing
    @Param int
AS
BEGIN

    SELECT strThing
    FROM tblThing
    WHERE lngParam = @Param;

END

【问题讨论】:

  • 请提供您的sp的DDL
  • 这只是一个琐碎的选择查询,添加到问题中。
  • 很奇怪,如果对象存在OBJECT_ID('<schema>.<object_name>')总是不为空。检查您的默认架构名称。
  • 我知道 :-S 我想知道 SQL Server 是否有多个地方在内部存储对象,出于某种原因,我在一个地方而不是另一个地方。
  • 您是否尝试过重启 SQL Server 实例?

标签: sql sql-server stored-procedures


【解决方案1】:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spThing]')
           AND TYPE IN (N'P', N'PC'))
DROP PROCEDURE [dbo].[spThing];
GO

CREATE PROCEDURE [dbo].[spThing]
AS
BEGIN 

-- Code here

END
GO

【讨论】:

    【解决方案2】:

    对于我的回答,它存在于 dbo.spThing 但不存在于 sys.spThing

    我没有具体的答案:

    有 2 种存储过程,1 用于系统,i 用于数据库对象。 1 paul 和 devart 的尝试是创建一个 dbo.spthing。

    首先,保罗说如果SELECT * FROM sys.objects WHERE name = 'spThing'没有返回行意味着系统存储过程中不存在并且devart尝试在dbo.Spthing中创建并将返回结果。

    只是想知道,您的问题在这一行是否正确 SELECT OBJECT_ID('dbo.spThing') 因为它会存在而不是不存在

    此外,您确实运行了 sp_help spThing 并且所有者是 dbo,因此您的 dbo.spthing 是存在的。但不是 sys.spthing

    【讨论】:

    • 感谢您的回答。 SELECT OBJECT_ID('sys.spThing') 也返回 NULL。不过现在已经修好了。
    【解决方案3】:

    一切正常 -

    IF OBJECT_ID ('dbo.spThing') IS NOT NULL
         DROP PROCEDURE dbo.spThing
    GO
    
    SELECT OBJECT_ID('dbo.spThing')
    GO
    
    CREATE PROCEDURE dbo.spThing
    
        @Param INT
    
    AS BEGIN
    
        SELECT strThing
        FROM dbo.tblThing
        WHERE lngParam = @Param
    
    END
    GO
    
    SELECT OBJECT_ID('dbo.spThing')
    

    输出 -

    -----------
    NULL
    (1 row(s) affected)
    
    -----------
    664283184
    (1 row(s) affected)
    

    【讨论】:

    • 感谢您的帮助。在重新启动 SQL Server 实例之前我没有尝试过这个,所以我不确定这是否有效。
    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2013-11-23
    相关资源
    最近更新 更多