2011-10-24 14 views
10

Sto creando una stored procedure in SQL Server tramite SSMS.Nome oggetto non valido - Stored procedure

ho scritto la stored procedure di seguito, ma quando clicco eseguire si sono dato l'errore:

Messaggio 208, livello 16, stato 6, Procedura NewQuestion, Linea 11 oggetto non valido nome 'hgomez .NewQuestion'.

la tabella è di proprietà è corretta. (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 

grazie in anticipo

+3

La vostra stored procedure esiste? Questo errore indica che non è possibile trovare l'oggetto, in questo caso il tuo SP. Lo hai già creato con una procedura di creazione? –

+0

forse questo aiuta http://stackoverflow.com/questions/9419710/invalid-object-name-sql-server-2008-r2-stored-procedure/23430576#23430576 – xameeramir

risposta

13

ero un fan di anteporre sempre i miei CREATE affermazioni con un esplicito controlla la presenza e il rilascio se è stato trovato.

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 

che può essere un po 'di fastidio per quanto riguarda i permessi in modo che altri usano un approccio in cui essi creano uno stub solo immediatamente ALTER esso.

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

Bella idea di uno stub, non ci ho mai pensato. Probabilmente potrei scegliere di mettere PRINT invece di SELECT, però, ma potrebbe essere solo una questione di gusti. –

4

Questo script tenta di modificare una procedura già esistente; non crea la procedura.

Per creare l'uso procedimento CREATE PROCEDURE

CREATE PROCEDURE [hgomez].[NewQuestion] 

Una volta che esiste la procedura, è possibile modificare la sua definizione utilizzando ALTER PROCEDURE

ALTER PROCEDURE [hgomez].[NewQuestion] 
+0

Soluzione rapida. Devo aver trascurato l'alter dichiarazione. Grazie – HGomez90

0

Questa soluzione https://stackoverflow.com/a/26775310/2211788 spiegato

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.