2011-10-24 33 views
10

Estoy creando un procedimiento almacenado en SQL Server a través de SSMS.Nombre de objeto inválido - Procedimiento almacenado

He escrito el procedimiento almacenado a continuación, sin embargo, cuando hago clic ejecutar que se me da el error:

Mensaje 208, nivel 16, estado 6, Procedimiento NewQuestion, Línea 11 objeto no válido nombre de 'hgomez .NewQuestion '.

la tabla es propiedad es correcta. (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 

gracias de antemano

+3

¿Existe el procedimiento almacenado? Este error indica que no puede encontrar el objeto, en este caso su SP. ¿Lo creó previamente con un procedimiento de creación? –

+0

quizás esto ayude http://stackoverflow.com/questions/9419710/invalid-object-name-sql-server-2008-r2-stored-procedure/23430576#23430576 – xameeramir

Respuesta

13

yo era un fan de siempre anteponiendo mis CREATE declaraciones con una explícita verificar la existencia y soltar si se encontró.

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 

que puede ser un poco de molestia con respecto a los permisos para que otros utilizan un enfoque en el que se crean un método talón de inmediato sólo para ALTER ella.

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

Buena idea sobre un talón, nunca lo pensé. Sin embargo, es posible que yo elija elegir PRINT en lugar de SELECT, pero eso puede ser solo cuestión de gustos. –

4

Este script intenta modificar un procedimiento que ya existe; no crea el procedimiento.

Para crear la utilización procedimiento CREATE PROCEDURE

CREATE PROCEDURE [hgomez].[NewQuestion] 

Una vez que existe el procedimiento, puede modificar su definición mediante el uso de ALTER PROCEDURE

ALTER PROCEDURE [hgomez].[NewQuestion] 
+0

Solución rápida. Debo haber pasado por alto la declaración alternativa. Gracias – HGomez90

0

Esta solución https://stackoverflow.com/a/26775310/2211788 explicó

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.

Cuestiones relacionadas