存储过程是否存在

时间:2013-07-11 09:09:25

标签: sql sql-server stored-procedures

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

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

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

BUT

如果我运行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

3 个答案:

答案 0 :(得分:5)

一切正常 -

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)

答案 1 :(得分: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 :(得分:0)

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

我没有具体的答案:

有2种类型的存储过程,1种用于系统,i用于databaseobject。 1 paul和devart尝试创建一个dbo.spthing。

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

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

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