2011-10-24 42 views
10

我正在通過SSMS在SQL Server中創建存儲過程。無效的對象名稱 - 存儲過程

我已經寫了下面的存儲過程,但是當我點擊執行它我給出的錯誤:

消息208,級別16,狀態6,過程NewQuestion,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 

預先感謝

+3

請問您的存儲過程存在嗎?這個錯誤表明它找不到對象,在這種情況下你的SP。你以前是否使用創建過程創建它? –

+0

也許這有助於http://stackoverflow.com/questions/9419710/invalid-object-name-sql-server-2008-r2-stored-procedure/23430576#23430576 – xameeramir

回答

13

我總是在前面加上我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,但這可能只是一個品味問題。 –

4

此腳本試圖修改已經存在的程序;它不會創建該過程。

要創建過程中使用CREATE PROCEDURE

CREATE PROCEDURE [hgomez].[NewQuestion] 

一旦過程存在,那麼你可以通過使用ALTER PROCEDURE

ALTER PROCEDURE [hgomez].[NewQuestion] 
+0

快速解決方案。我一定忽略了alter語句。謝謝 – HGomez90

0

該解決方案https://stackoverflow.com/a/26775310/2211788解釋

If you drop and re-create a stored procedure it gets a new objectid - the list of stored procedures in SSMS is linked to the id it knows at the time the list was built. If you re-create it but don't refresh the stored procedures folder then any attempts to edit it will indicate the procedure is not found as the id has changed.