2010-04-21 17 views
5

मैं एक संग्रहीत प्रक्रिया है जो अपने आप क्रम में अन्य संग्रहित प्रक्रियाओं की एक सूची कॉल:संग्रहित प्रक्रिया - मजबूर कर निष्पादन आदेश

CREATE PROCEDURE [dbo].[prSuperProc] 

AS 
BEGIN 
    EXEC [dbo].[prProc1] 
    EXEC [dbo].[prProc2] 
    EXEC [dbo].[prProc3] 
    --etc 
END 

हालांकि, मैं कभी कभी अपने टेबल, prProc2, द्वारा उत्पन्न में कुछ अजीब परिणाम हो जो prProc1 द्वारा उत्पन्न परिणामों पर निर्भर है। यदि मैं मैन्युअल रूप से prProc1, prProc2, prProc3 निष्पादित करता हूं तो सब कुछ ठीक है। ऐसा प्रतीत होता है कि जब मैं शीर्ष-स्तरीय प्रक्रिया चलाता हूं, तो Proc1 पूरा होने से पहले Proc2 निष्पादित किया जा रहा है और इसके परिणाम डीबी में किए गए हैं। यह हमेशा गलत नहीं होता है, लेकिन ऐसा लगता है कि Proc1 के पास लंबे निष्पादन का समय है (इस मामले में ~ 10s)।

मैं prSuperProc को कैसे बदलूं जैसे कि प्रत्येक प्रक्रिया केवल पिछली प्रक्रिया पूरी होने और प्रतिबद्ध होने के बाद निष्पादित होती है? लेन-देन? अतिरिक्त विस्तार के लिए

संपादित करें:

जो एक स्तंभ जो डिफ़ॉल्ट रूप से अशक्त है मेरी DB में एक टेबल है। prProc1 इस कॉलम को पॉप्युलेट करने के लिए इस तालिका पर अद्यतन विवरणों का एक सेट करता है। prProc2 फिर इस कॉलम के मानों के आधार पर सारांश डेटा को द्वितीयक तालिका में सम्मिलित करता है।

जब मैं सुपर प्रक्रिया चलाता हूं, तो मैं (कभी-कभी) देख रहा हूं कि पहली तालिका में परिणाम prProc1 द्वारा सही ढंग से गणना की जाती हैं, लेकिन prProc2 ने परिणाम उत्पन्न किए हैं जैसे कॉलम सभी नल था। यदि मैं मैन्युअल रूप से prProc2 चलाता हूं, तो सारांश डेटा सही ढंग से उत्पन्न होता है।

उत्तर

4

प्रो 2 प्रो 1 से पहले नहीं चलाया जाएगा: यह एक आसान है। एसक्यूएल दूसरे के बाद एक निष्पादित करेगा लेकिन आदेश से बाहर नहीं होगा।

आप इस का उपयोग कर सकते हैं प्रोफ़ाइल TSQL_SPs template

आप आवरण proc चल के 2 सज़ाएँ है, उदाहरण के लिए है?

+1

मैं कुछ आवरण proc केवल किसी भी समय एक बार चलाया जाता है कर रहा हूँ - यह केवल इस समय मेरे द्वारा प्रयोग किया जाता है! मैं सुझाव नहीं दे रहा हूं कि वे आदेश से बाहर हो रहे हैं, बस Proc1 द्वारा किए गए अपडेट पूरी तरह से प्रतिबद्ध नहीं हैं जब Proc2 प्रारंभ होता है, और मैंने बग को हटाने के लिए मैन्युअल रूप से निष्पादित करके इसकी पुष्टि की है। – meepmeep

+0

@ मिपमिप, इन प्रक्रियाओं (रैपर समेत) में और फिर प्रिंटर में 'PRINT' prprroc1'' और 'प्रिंटर' समाप्त prprroc1'' टाइप स्टेटमेंट्स जोड़ें और फिर एसएसएमएस में 'EXEC [dbo] चलाएं। [PrSuperProc] 'पैरामीटर के साथ तो क्या होता है यह देखने के लिए Proc1 का एक लंबा निष्पादन समय होता है (इस मामले में ~ 10s)। –

+0

मैंने इसे अंदर रखा है। हमेशा के रूप में, बग पुनरावृत्ति करने से इंकार कर रहा है, इसलिए मैं इस क्यू को तब तक खोल दूंगा जब तक यह फिर से न हो और नतीजे देखें। धन्यवाद! – meepmeep

2

prSuperProc की प्रत्येक कॉल के लिए, वे एक धारावाहिक फैशन में भाग लेंगे, 1 फिर अगला, फिर अगला। हालांकि, यदि एकाधिक उपयोगकर्ता prSuperProc पर कॉल कर रहे हैं, तो आपके पास उपयोगकर्ता 1 के prProc1-prProc2 + prProc3 और उपयोगकर्ता 2 के prProc1-prProc2 + prProc3 का एक अंतःस्थापित निष्पादन होगा।

कुछ इस तरह हो सकता है जो:

user1 calls prSuperProc 
user1   prProc1 is called 
user2 calls prSuperProc 
user1   prProc2 is called 
user2   prProc1 is called 
user1   prProc3 is called 
user2   prProc2 is called 
user2   prProc3 is called 

यह वास्तव में क्या आपके प्रक्रियाओं, कितने समवर्ती उपयोगकर्ताओं, और क्या पंक्तियों के भीतर

चल रहा है कि वे बदल रहे हैं और/या ताला लगा है पर निर्भर करता है एक transactio का उपयोग करके

CREATE PROCEDURE [dbo].[prSuperProc] 

AS 
BEGIN TRY 
    BEGIN TRANSACTION 
    EXEC [dbo].[prProc1] 
    EXEC [dbo].[prProc2] 
    EXEC [dbo].[prProc3] 
    --etc 
    COMMIT 
END TRY 
BEGIN CATCH 
    IF XACT_STATE()!=0 
    BEGIN 
     ROLLBACK TRANSACTION 
    END 

    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_SEVERITY() AS ErrorSeverity 
     ,ERROR_STATE() AS ErrorState 
     ,ERROR_PROCEDURE() AS ErrorProcedure 
     ,ERROR_LINE() AS ErrorLine 
     ,ERROR_MESSAGE() AS ErrorMessage 


    --will echo back the complete original error message 
    DECLARE @ErrorMessage nvarchar(400), @ErrorNumber int, @ErrorSeverity int, @ErrorState int, @ErrorLine int 
    SELECT @ErrorMessage = N'Error %d, Line %d, Message: '+ERROR_MESSAGE(),@ErrorNumber = ERROR_NUMBER(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(),@ErrorLine = ERROR_LINE() 
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorNumber,@ErrorLine) 

END CATCH 
GO 

: संपादित करें आप समस्या को ठीक करने के लिए इस कोशिश कर सकते हैं सब कुछ के आसपास, यह किसी भी समवर्ती उपयोगकर्ताओं को एक ही डेटा पर काम करने से रोकने का प्रयास करेगा। TRY-CATCH का उपयोग करने से किसी भी प्रक्रिया में होने वाली त्रुटियों को पकड़ने का प्रयास किया जाएगा और अगले लोगों को तब से चलने से रोक दिया जाएगा।

1

मुझे एक ही समस्या थी (उस समय एक उत्पाद को बनाए रखना था) और मैंने इसे सबसे अधिक proc बाहर निकालने और शीर्ष प्रोसेस को निष्पादित करके तय किया। तब वह proc उस पर निर्भर प्रो को निष्पादित करेगी और इसी तरह। यह बी *** में दर्द है लेकिन यह काम करता है।

HTH

+0

धन्यवाद - मैं नीचे दिए गए लेनदेन का प्रयास करने जा रहा हूं, लेकिन अगर यह विफल रहता है तो यह एक गैर-सुरुचिपूर्ण समाधान के रूप में काम करता है। मैं प्रसंस्करण को स्वतंत्र रूप से भी चलाने में सक्षम होना चाहता हूं, इसलिए मुझे कुछ प्रकार का पैरामीटर जोड़ना होगा जो प्रो कॉल के माध्यम से कैस्केड करता है। – meepmeep

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