Недопустимое имя объекта - сохраненная процедура

Я создаю хранимую процедуру в SQL Server через SSMS.

Я написал хранимую процедуру ниже, однако, когда я нажимаю выполнить, ему присваивается ошибка:

Msg 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

Заранее спасибо

Ответ 1

Я был поклонником всегда добавляя мои инструкции 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 it.

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

Ответ 2

Этот script пытается изменить уже существующую процедуру; он не создает процедуру.

Чтобы создать процедуру, используйте CREATE PROCEDURE

CREATE PROCEDURE [hgomez].[NewQuestion]

Как только процедура существует, вы можете изменить ее определение, используя ALTER PROCEDURE

ALTER PROCEDURE [hgomez].[NewQuestion]

Ответ 3

Это решение fooobar.com/info/524722/... объяснено

Если вы удалите и заново создаете хранимую процедуру, он получит новый объект - список хранимых процедур в SSMS связан с идентификатором, который он знает в момент создания списка. Если вы заново создаете его, но не обновляете папку хранимых процедур, тогда любые попытки его редактирования укажут, что процедура не найдена с изменением идентификатора.