2011-10-24 36 views
10

tôi đang tạo ra một thủ tục lưu trữ trong SQL Server qua SSMS.hợp lệ Tên Object - Thủ tục lưu trữ

Tôi đã viết các thủ tục lưu trữ bên dưới, tuy nhiên khi tôi bấm thực hiện nó đang được các lỗi:

Msg 208, Level 16, State 6, Thủ tục NewQuestion, Line 11 đối tượng không hợp lệ tên 'hgomez .Câu hỏi mới'.

bảng là quyền sở hữu là chính xác. (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 

Cảm ơn trước

+3

Liệu thủ tục lưu trữ của bạn tồn tại? Lỗi này chỉ ra rằng nó không thể tìm thấy đối tượng, trong trường hợp này là SP của bạn. Trước đây bạn đã tạo nó bằng quy trình tạo chưa? –

+0

có lẽ đây sẽ giúp http://stackoverflow.com/questions/9419710/invalid-object-name-sql-server-2008-r2-stored-procedure/23430576#23430576 – xameeramir

Trả lời

13

Tôi là một fan hâm mộ của luôn prepending CREATE báo cáo của tôi với một rõ ràng kiểm tra sự tồn tại và giảm nếu nó được tìm thấy.

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 

Đó có thể là một chút rắc rối liên quan đến quyền với để những người khác sử dụng một cách tiếp cận trong đó họ tạo ra một phương pháp còn sơ khai chỉ ngay ALTER nó.

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

Ý tưởng hay về một bài hát, không bao giờ nghĩ về nó. Tôi có lẽ có thể chọn để đặt IN thay vì SELECT, mặc dù, nhưng đó có thể chỉ là vấn đề của hương vị. –

4

Kịch bản này sửa đổi cố gắng một thủ tục đã tồn tại; nó không tạo ra thủ tục.

Để tạo việc sử dụng thủ tục CREATE PROCEDURE

CREATE PROCEDURE [hgomez].[NewQuestion] 

Khi một thủ tục tồn tại, bạn có thể sửa đổi định nghĩa của nó bằng cách sử dụng ALTER PROCEDURE

ALTER PROCEDURE [hgomez].[NewQuestion] 
+0

giải pháp nhanh. Tôi phải bỏ qua câu lệnh thay đổi. Cảm ơn – HGomez90

0

Giải pháp này giải thích 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.

Các vấn đề liên quan