2011-10-24 5 views
10

मैं एसएसएमएस के माध्यम से SQL सर्वर में संग्रहीत प्रक्रिया बना रहा हूं।अमान्य ऑब्जेक्ट नाम - संग्रहीत प्रक्रिया

मैं नीचे संग्रहीत प्रक्रिया में लिखा है, लेकिन जब मैं निष्पादित क्लिक दिया हूँ त्रुटि:

संदेश 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 

अग्रिम धन्यवाद

+3

अपने संग्रहीत प्रक्रिया मौजूद है समझाया? यह त्रुटि इंगित करती है कि यह ऑब्जेक्ट नहीं ढूंढ सकता है, इस मामले में आपका एसपी। क्या आपने इसे पहले एक निर्माण प्रक्रिया के साथ बनाया था? –

+0

शायद यह http://stackoverflow.com/questions/9419710/invalid-object-name-sql-server-2008-r2-stored-procedure/23430576#23430576 – xameeramir

उत्तर

13

का उपयोग करके अपनी परिभाषा को संशोधित कर सकते अस्तित्व की जांच करें और अगर यह पाया गया तो छोड़ दें।

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 
+1

एक स्टब के बारे में अच्छा विचार, कभी इसके बारे में सोचा नहीं। शायद मैं चयन के बजाय PRINT डालना चुन सकता हूं, लेकिन यह केवल स्वाद का मामला हो सकता है। –

4

यह स्क्रिप्ट एक प्रक्रिया पहले से मौजूद है कि संशोधित करने के लिए कोशिश करता है; यह प्रक्रिया नहीं बनाता है।

एक बार प्रक्रिया मौजूद है प्रक्रिया उपयोग CREATE PROCEDURE

CREATE PROCEDURE [hgomez].[NewQuestion] 

बनाने के लिए आपको मैं हमेशा एक स्पष्ट के साथ मेरी CREATE बयान prepending के प्रशंसक थे ALTER PROCEDURE

ALTER PROCEDURE [hgomez].[NewQuestion] 
+0

त्वरित समाधान में सहायता करता है। मैंने परिवर्तन कथन को अनदेखा कर दिया होगा। धन्यवाद – HGomez90

0

यह समाधान 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.

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^