Неверное имя объекта - хранимая процедура - PullRequest
11 голосов
/ 24 октября 2011

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

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

Сообщение 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

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

Ответы [ 4 ]

14 голосов
/ 24 октября 2011

Я был поклонником того, чтобы всегда добавлять мои 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
5 голосов
/ 24 октября 2011

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

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

CREATE PROCEDURE [hgomez].[NewQuestion]

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

ALTER PROCEDURE [hgomez].[NewQuestion]
0 голосов
/ 29 августа 2018

Это случилось со мной однажды, когда у меня было открыто два экземпляра SSMS, и я работал над тем, который открыл первым.Закрыл их обоих, снова открыл, и все заработало.

0 голосов
/ 24 апреля 2016

Это решение https://stackoverflow.com/a/26775310/2211788 объяснено

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

...