"संग्रहीत कार्यविधि नहीं ढूँढ सका" भले ही संग्रहीत कार्यविधि MS SQL सर्वर प्रबंधन स्टूडियो में बनाई गई हो


21

मैंने testtableडेटाबेस के अंदर एक तालिका बनाई testbaseहै जिसमें निम्नलिखित संरचना है:

product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)

जो मैंने Microsoft SQL Server 2008 प्रबंधन स्टूडियो का उपयोग किया था।

मैंने testtable_pricesmallerनिम्नानुसार एक संग्रहीत प्रक्रिया बनाई

use testbase
go
create procedure testtable_pricesmaller
    @pricelimit money
as
select * from testtable where price = @pricelimit;
go

और Object ExplorerMicrosoft SQL Server प्रबंधन स्टूडियो पर संग्रहीत कार्यविधियाँ देखने में सक्षम हैं । (यह निम्नलिखित वृक्ष संरचना में सूचीबद्ध है Object Explorer)

Databases
    + testbase
        + Tables
            + dbo.testtable
        + Programmability
            + Stored Procedures
                + dbo.testtable_pricesmaller

जब मुझे निम्न त्रुटि मिलती है तो मुझे यह बहुत अजीब लगता है:

Could not find the stored procedure 'dbo.testtable_pricesmaller'.

जब मैं निम्नलिखित एसक्यूएल बयान निष्पादित करता हूं:

execute dbo.testtable_pricesmaller 50

यह क्या गायब हो सकता है?


क्या आपने सुनिश्चित किया था कि आपका निष्पादित विवरण "टेस्टबेस" डेटाबेस के संदर्भ में चल रहा है? आप एक USE कथन जोड़ने या ऑब्जेक्ट नाम को पूरी तरह से योग्य बनाने का प्रयास कर सकते हैं।
शॉन मेल्टन

हां, मैंने USEबयान जोड़ दिया लेकिन यह मुझे त्रुटि देता है।
जैक

मैं स्पष्ट रूप से मेरे निष्पादित बयान में डेटाबेस नाम को परिभाषित करने के लिए किया था: EXEC [testbase] [dbo] [testtable_pricesmaller]
Jroonk

जवाबों:


17

IntelliSense स्थानीय कैश को ताज़ा करें इसे ठीक करना चाहिए


7

नई संग्रहीत प्रक्रिया जोड़ने के बाद आपको डेटाबेस को पुनरारंभ नहीं करना चाहिए, हालांकि आपको इसे देखने के लिए अपने ऑब्जेक्ट एक्सप्लोरर को ताज़ा करना होगा।

अगली बार जब आप एक संग्रहीत प्रक्रिया जोड़ते हैं, तो ऑब्जेक्ट एक्सप्लोरर से राइट क्लिक निष्पादित विकल्प चलाने की कोशिश करें और अपने मापदंडों को दर्ज करें और देखें कि क्या यह चलता है। यदि यह नहीं चलता है तो मुझे यकीन नहीं है कि आपकी समस्या क्या है। यदि यह चलता है तो यह कुछ सरल हो सकता है जैसे SQL गलत डेटाबेस से क्वेरी करने की कोशिश कर रहा है।


4

अंत में मुझे पता है कि एमएस SQL ​​सर्वर प्रबंधन स्टूडियो में संदेश क्यों दिखाई देता है।

MS SQL सर्वर प्रबंधन स्टूडियो को इसमें संग्रहीत कार्यविधि बनाने के बाद इसे पुनः आरंभ करने की आवश्यकता होती है।

MS SQL सर्वर प्रबंधन स्टूडियो को पुनरारंभ करने के बाद, अब ऐसी कोई त्रुटि नहीं है।

(अजीब बात है, क्या इसका मतलब यह है कि हर बार जब मैं एक संग्रहीत प्रक्रिया बनाता हूं, तो मुझे इसे पुनरारंभ करना होगा?)


12
आपको इसे पुनः आरंभ नहीं करना चाहिए।
शॉन मेल्टन

1
@ शनमेलन का मतलब है कि मैं एमएस SQL ​​सर्वर प्रबंधन स्टूडियो को बंद कर देता हूं और एमएस SQL ​​सर्वर प्रबंधन स्टूडियो को फिर से खोलता हूं। मुझे बस यह काफी अजीब लगता है कि मुझे बंद करना है और फिर इसे खोलना है। क्या MS SQL सर्वर प्रबंधन स्टूडियो (SSMS) का कोई विन्यास है जो मैं गायब हो सकता हूं, जिसके परिणामस्वरूप SSMS यह प्रतिबिंबित करने में असमर्थ है कि संग्रहीत प्रक्रिया पहले से ही बनाई गई है?
जैक

5
IntelliSense ने आपके द्वारा किए गए एकमात्र पिछड़े हुए भाग हैं। निष्पादन कथन को निष्पादित करना एसएसएमएस को फिर से शुरू किए बिना काम करना चाहिए था। कुछ और है जिसने इसमें काम नहीं किया है। मैं @ शनमेलन से सहमत हूं।
थॉमस स्ट्रिंगर

@ शकर, दिलचस्प! मैं सराहना करूंगा अगर कोई मुझे समझा सकता है कि मेरा एसएसएमएस इस तरह से व्यवहार क्यों करता है कि मुझे यह काफी अजीब लगता है।
जैक

6
भविष्य के संदर्भ के लिए: Ctrl-Shift-R स्थानीय कैश को रीति-रिवाज़ के लिए ताज़ा करेगा।
एडम स्कार्प

3

आपका क्रिएट कमांड होना चाहिए

create procedure dbo.testtable_pricesmaller
    @pricelimit money

आप इससे चूक रहे हैं dbo. प्रक्रिया नाम से पहले । जब भी आप एक प्रक्रिया बनाते हैं, तो उपयोगकर्ता / स्कीमा को स्पष्ट रूप से परिभाषित करने के लिए एक प्रक्रिया का नाम देना अच्छा होता है। प्रक्रिया के नाम में पूरी तरह से योग्य हस्ताक्षर होने चाहिए।

उम्मीद है इससे आपको मदद मिलेगी।


3

SQL सर्वर 2008 में, जब आप Windows खाते के तहत लॉग इन करते हैं, अगर आपके पास SYSADMIN सुरक्षा स्तर नहीं है, जब आप स्कीमा को स्पष्ट रूप से निर्दिष्ट किए बिना एक ऑब्जेक्ट बनाते हैं, तो यह [DOMAIN \ username] के तहत बना सकता है। ] के बजाय [dbo]। [ObjectName] (यह SQL सर्वर 2012 में तय किया गया था मुझे लगता है)।

मुझे यह समस्या तब हुई थी जब मैंने एक उपयोगकर्ता सुरक्षा स्तर को कम कर दिया था, और जिस प्रक्रिया को वह निष्पादित कर रहा था, उसमें से एक स्कीमा के बिना तालिकाओं को छोड़ना और फिर से बनाना था, इसलिए बाकी प्रक्रिया दुर्घटनाग्रस्त हो गई क्योंकि यह फिर से वस्तु तक नहीं पहुंच सका। । तालिकाएँ अब उनके डोमेन उपयोगकर्ता नाम के तहत बनाई गई थीं।

इस व्यवहार के बारे में Microsoft पोस्ट यहाँ है:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (अनुभाग के लिए "निहित योजनाएं और उपयोगकर्ता निर्माण" देखें)

डीबीओ स्कीमा के तहत तालिका नहीं बनाई जा रही है

SQL 2008 R2 उपयोगकर्ता / स्कीमा बनाता है जब Windows उपयोगकर्ता तालिकाओं बनाता है

तो, संक्षेप में, आपके पास शायद या तो एक डेटाबेस समस्या है (आप एक डेटाबेस में अपनी तालिका बनाते हैं लेकिन इसे दूसरे से एक्सेस करने की कोशिश करते हैं) या आपको समस्या है जैसे मैंने अभी बताया।


2

मुझे पता है यह पुराना है; जब मैं इस समस्या का हल खोज रहा था, तब मैं इस सवाल पर आया था, और मैं इस उत्तर को इस उम्मीद में पोस्ट कर रहा हूं कि यह दूसरों को भी मदद करता है, जो इस प्रश्न को खोजते हैं।

मेरे मामले में, मुझे एक साझा डेटा स्रोत का उपयोग करके SSRS रिपोर्ट चलाते समय त्रुटि संदेश मिला। इस साझा डेटा स्रोत ने एक डिफ़ॉल्ट डेटाबेस (डिफ़ॉल्ट कैटलॉग = पैरामीटर) निर्दिष्ट नहीं किया था, और मैं इसे कनेक्शन स्ट्रिंग में नहीं जोड़ सका क्योंकि मेरे पास पासवर्ड नहीं है (और जब आप SSRS डेटा स्रोत में कुछ बदलते हैं तो यह बंद हो जाता है आप पासवर्ड फिर से दर्ज करना चाहते हैं)।

इसे हल करने के लिए, मैंने मास्टर से SQL सर्वर इंस्टेंस में लॉगिन के लिए डिफ़ॉल्ट डेटाबेस को बदल दिया, जिसमें संग्रहीत कार्यविधि के साथ डेटाबेस उस रिपोर्ट को निष्पादित करना चाहता था।

SSMS से चीजें चलाते समय, ध्यान रखें कि ऑब्जेक्ट एक्सप्लोरर फलक एक कनेक्शन है जबकि आपके पास जो भी संपादक है वह पूरी तरह से अलग कनेक्शन है। तो आप ऑब्जेक्ट एक्सप्लोरर में SQL01 के लिए ऑब्जेक्ट देख सकते हैं, लेकिन आप जिस कोड को संपादक में चला रहे हैं, वह SQL02 के खिलाफ चलेगा - मैं इस समस्या में पिछले कुछ वर्षों में और बहुत अधिक cussing के बाद और "क्यों नहीं होगा?" यह चलेगा?" मेरी गलती का एहसास हुआ। संपादक के लिए, निचले दाएं कोने में देखें कि आप किस इंस्टेंस और डेटाबेस से जुड़े हैं।


1

TL; DR: आपके पास एक संग्रहीत कार्यविधि हो सकती है जो किसी अन्य संग्रहीत कार्यविधि को कॉल कर रही है जो मौजूद नहीं है।


मुझे यह समस्या हुई और मुझे ठीक लगा। यहाँ क्या हुआ है। मैंने एक संग्रहीत प्रक्रिया बनाई:

create procedure dbo.MyProc
    ...

मैंने फिर एक और संग्रहित प्रक्रिया बनाई, जिसने पहले एक को निष्पादित किया

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc
    ...

कुछ समय बाद, मैंने नाम बदल dbo.MyProcदिया dbo.MyProc2। इसका नाम बदलने के बाद, जब मैंने कॉल करने का प्रयास किया, तो मुझे dbo.MyProcCallerयह त्रुटि संदेश मिलेगा:

exec dbo.MyProcCaller

संग्रहीत कार्यविधि 'RLM.usp_getSecondaryRestrictedLists_Old' नहीं मिली।

मेरा समाधान नए नाम का उपयोग करने के लिए मेरी दूसरी संग्रहीत प्रक्रिया को बदलना था:

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc2
    ...

यह जाँचने का एक सरल तरीका है कि क्या आपको यह समस्या है। संग्रहीत प्रक्रिया के पाठ को संशोधित करने के लिए क्लिक करें और फिर उस पाठ को निष्पादित करें। यदि आपको इस तरह की चेतावनी मिलती है, तो आपको अपनी संग्रहीत प्रक्रिया का नाम बदलने की आवश्यकता है:

मॉड्यूल 'dbo.MyProcCaller' लापता वस्तु 'dbo.MyProc' पर निर्भर करता है। मॉड्यूल अभी भी बनाया जाएगा; हालाँकि, यह तब तक सफलतापूर्वक नहीं चल सकता जब तक कि ऑब्जेक्ट मौजूद न हो।

(1 पंक्ति) प्रभावित


0

यह सवाल कुछ साल पुराना है, लेकिन मैं सिर्फ मेरे जैसे किसी व्यक्ति के लिए एक और संभावना फेंकना चाहता हूं, जो बाद में मिला।

मैंने यह आदेश चलाया: EXEC SP_CONFIGURE 'एजेंट XP'

और त्रुटि का वर्णन किया गया: Msg 2812, स्तर 16, राज्य 62, पंक्ति 1 संग्रहीत कार्यविधि 'SP_CONFIGO' नहीं ढूँढ सका।

लेकिन फिर मुझे याद आया कि यह सर्वर केस-संवेदी है। इसलिए इस कमांड ने ठीक काम किया: EXEC sp_configure 'Agent XPs'

HTH

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.