4

我有一个带有存储过程的 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
4

3 回答 3

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)
于 2013-07-11T09:51:22.280 回答
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
于 2014-03-22T10:26:50.947 回答
0

对于我的回答,它存在于 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

于 2013-07-11T10:13:22.553 回答