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

11

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

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

Msg 208, Level 16, State 6, Procedure NewQuestion, Line 11 Invalid object name 'hgomez.NewQuestion'.

表的所有权是正确的。(hgomez.Questions)

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

提前感谢


3
你的存储过程存在吗?这个错误表明找不到该对象,也就是你的存储过程。之前是否使用 "create procedure" 命令创建了它? - Steven Mastandrea
也许这可以帮助你:https://dev59.com/JWox5IYBdhLWcg3wIQ1o#23430576 - Zameer Ansari
4个回答

14

我一直喜欢在我的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

1
好主意关于存根,从来没有想过。我可能会选择放置 PRINT 而不是 SELECT,但这可能只是品味的问题。 - Andriy M

5
这个脚本试图修改一个已经存在的存储过程,而不是创建存储过程。
要创建存储过程,请使用CREATE PROCEDURE
CREATE PROCEDURE [hgomez].[NewQuestion]

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

ALTER PROCEDURE [hgomez].[NewQuestion]

快速解决方案。我一定是忽略了alter语句。谢谢。 - HGomez

1

这个https://stackoverflow.com/a/26775310/2211788解释了,如果你删除并重新创建一个存储过程,则它会获得一个新的objectid-SSMS中存储过程列表链接到在构建列表时所知的id。如果您重新创建它但不刷新存储过程文件夹,则任何尝试编辑它的操作都将指示找不到该过程,因为id已更改。


1

我曾经遇到过这种情况,当时我打开了两个SSMS实例并在第一个实例上工作。后来我关闭了它们,重新打开后问题就解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接