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

时间:2011-10-24 01:12:47

标签: sql sql-server stored-procedures ssms

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

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

Msg 208,Level 16,State 6,Procedure NewQuestion,Line 11 无效的对象名称'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

提前致谢

4 个答案:

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

此脚本尝试修改已存在的过程;它没有创建程序。

要创建程序,请使用CREATE PROCEDURE

CREATE PROCEDURE [hgomez].[NewQuestion]

程序存在后,您可以使用ALTER PROCEDURE

修改其定义
ALTER PROCEDURE [hgomez].[NewQuestion]

答案 2 :(得分:0)

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

  

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

答案 3 :(得分:0)

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