无效的对象名称 - 存储过程

Posted

技术标签:

【中文标题】无效的对象名称 - 存储过程【英文标题】:Invalid Object Name - Stored Procedure 【发布时间】:2011-10-24 01:12:46 【问题描述】:

我正在通过 SSMS 在 SQL Server 中创建存储过程。

我已经编写了下面的存储过程,但是当我单击 执行 时出现错误:

消息 208,级别 16,状态 6,过程 NewQuestion,第 11 行 无效的对象名称“hgomez.NewQuestion”。

该表的所有权是正确的。 (hgomez.问题)

USE [devworks_oscar]
GO
/****** Object:  StoredProcedure [hgomez].[NewQuestion]    Script Date: 10/23/2011 23:55:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [hgomez].[NewQuestion]
    (
    @QUESTIONNAME nvarchar(50),
    @QUESTION_ID int OUTPUT
    )

AS
    /* SET NOCOUNT ON */
    INSERT INTO [Questions] (QuestionText) VALUES (@QUESTIONNAME)
    SET @QUESTION_ID = SCOPE_IDENTITY();
    RETURN

提前致谢

【问题讨论】:

你的存储过程是否存在?此错误表明它找不到对象,在这种情况下是您的 SP。您之前是否使用创建过程创建它? 也许这有帮助***.com/questions/9419710/… 【参考方案1】:

我总是喜欢在我的 CREATE 语句前面加上明确的检查是否存在,如果发现则删除。

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'NewQuestion' AND ROUTINE_SCHEMA = 'hgomez')
BEGIN
    DROP PROCEDURE hgomez.NewQuestion
END
GO

-- this is always a CREATE
CREATE PROCEDURE [hgomez].[NewQuestion]
    (
    @QUESTIONNAME nvarchar(50),
    @QUESTION_ID int OUTPUT
    )

AS
    /* SET NOCOUNT ON */
    INSERT INTO [Questions] (QuestionText) VALUES (@QUESTIONNAME)
    SET @QUESTION_ID = SCOPE_IDENTITY();
    RETURN

这在权限方面可能有点麻烦,因此其他人使用一种方法,即他们创建一个存根方法只是为了立即ALTER它。

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'NewQuestion' AND ROUTINE_SCHEMA = 'hgomez')
BEGIN
    EXEC ('CREATE PROCEDURE hgomez.NewQuestion AS SELECT ''stub version, to be replaced''')
END
GO

-- This is always ALTER
ALTER PROCEDURE [hgomez].[NewQuestion]
    (
    @QUESTIONNAME nvarchar(50),
    @QUESTION_ID int OUTPUT
    )

AS
    /* SET NOCOUNT ON */
    INSERT INTO [Questions] (QuestionText) VALUES (@QUESTIONNAME)
    SET @QUESTION_ID = SCOPE_IDENTITY();
    RETURN

【讨论】:

关于存根的好主意,从没想过。不过,我可能会选择使用 PRINT 而不是 SELECT,但这可能只是个人喜好问题。【参考方案2】:

这个脚本试图修改一个已经存在的过程;它不会创建过程。

要创建程序,请使用CREATE PROCEDURE

CREATE PROCEDURE [hgomez].[NewQuestion]

一旦过程存在,您可以使用ALTER PROCEDURE修改其定义

ALTER PROCEDURE [hgomez].[NewQuestion]

【讨论】:

快速解决方案。我一定忽略了alter语句。谢谢【参考方案3】:

此解决方案https://***.com/a/26775310/2211788 解释

如果您删除并重新创建存储过程,它会获得一个新的 objectid - SSMS 中的存储过程列表链接到它在构建列表时知道的 id。如果您重新创建它但不刷新存储过程文件夹,那么任何编辑它的尝试都将表明该过程未找到,因为 id 已更改。

【讨论】:

【参考方案4】:

当我打开两个 SSMS 实例并且我正在处理我第一个打开的实例时,这种情况发生在我身上一次。将它们都关闭,重新打开,效果很好。

【讨论】:

以上是关于无效的对象名称 - 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

无效的对象名称'dbo.sp_GetCustomerRequestReport'。执行存储过程时

oracle存储过程对象无效

ASP.NET MVC - 存储过程执行返回无效对象

SQL Server 导入和导出向导在使用临时表的存储过程中给出无效对象错误

SQL 无效的对象名称“地址类型”

oracle存储过程提示编译完成但存在错误,如何查看错误