我有一个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
答案 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