2010-02-04 15 views
8

में संग्रहीत प्रक्रिया आउटपुट पैरामीटर मुझे int आउटपुट पैरामीटर के साथ संग्रहीत प्रक्रिया मिली है। अगर मैं एसक्यूएल सर्वर प्रोफाइलर चलाने के लिए, कुछ नेट कोड के माध्यम से संग्रहीत प्रक्रिया निष्पादित, और RPC पर कब्जा: पूर्ण घटना, TextData इस तरह दिखता है:SQL सर्वर प्रोफाइलर

declare @p1 int 
set @p1=13 
exec spStoredProcedure @[email protected] output 
select @p1 

यह है कि यह उत्पादन के मूल्य में हो रही है क्यों दिखता है संग्रहीत प्रक्रिया को निष्पादित करने से पहले पैरामीटर?

+0

? क्योंकि यह जिस तरह से प्रदर्शित होता है ?? सवाल कहां है? –

+0

ठीक है, जिस तरह से यह प्रदर्शित होता है, यह संग्रहीत प्रक्रिया को निष्पादित करने से पहले आउटपुट पैरामीटर के मूल्य का आकलन कर रहा है। यह स्पष्ट रूप से आदेशों का अनुक्रम नहीं है, इसलिए मैं सोच रहा था कि यह इस तरह प्रदर्शित क्यों होता है। –

उत्तर

5

आरपीसी: पूर्ण घटना वर्ग इंगित करता है कि रिमोट प्रक्रिया कॉल पूरा हो चुका है। तो आउटपुट पैरामीटर वास्तव में उस बिंदु पर जाना जाता है। देखें कि क्या आरपीसी का पता लगाना है: शुरू हुआ आपको दिखाता है कि आप क्या उम्मीद करते हैं।

+0

ठीक है, मैं देखता हूं, आरपीसी में: प्रारंभ की गई घटना @ p1 चर को पूर्ण पर सेट किया गया है। मुझे लगता है कि समझ में आता है। –

+0

मुझे विश्वास है कि यह एक बग है (और उस प्रभाव का उत्तर जोड़ा गया है) - क्या आपके पास कोई संकेत है कि यह इरादा व्यवहार है? मुझे कोई दस्तावेज नहीं मिला। – Tao

4

यह कोई फर्क नहीं पड़ता कि आप इसे कैसे देखते हैं, एक बग। एसक्यूएल प्रोफाइलर "टेक्स्टडाटा" का इरादा किसी को संग्रहीत प्रक्रिया कॉल को समझने और दोहराने में सक्षम बनाना है। इस मामले में, इस टी-एसक्यूएल को चलाने से आपको पूरी तरह से अलग परिणाम मिल सकता है, यदि spStoredProcedure प्रक्रिया @OutParam पैरामीटर के इनपुट मान पर कोई तर्क निर्भर है, जहां "13" का मान किसी इनपुट मूल्य के रूप में अर्थपूर्ण था ।

यह देखना आसान है कि यह सुविधाजनक कैसे हो सकता है (आपको प्रो कॉल के आउटपुट मान देखने में सक्षम बनाता है, जिसे अन्यथा "आरपीसी आउटपुट पैरामीटर" ईवेंट के साथ करने की आवश्यकता होती है), लेकिन यह प्रभावी रूप से "झूठ" टी-एसक्यूएल समकक्ष को किस प्रकार निष्पादित किया गया था।

संबंधित: मैं बस माइक्रोसॉफ्ट कस्टमर सर्विस और सपोर्ट टीम के एक लेख में आया - एक और मामले के बारे में जहां आरपीसी का रूपांतरण: पूर्ण घटना के बाइनरीडेटा को एक प्रदर्शित करने योग्य टेक्स्टडेटा मान में मूल आरपीसी कॉल का गलत प्रजनन होता है - यह समय कोडपेज मुद्दे:
http://blogs.msdn.com/b/psssql/archive/2008/01/24/how-it-works-conversion-of-a-varchar-rpc-parameter-to-text-from-a-trace-trc-capture.aspx

UPDATED: इस के साथ प्रयोग करके, मैं व्यवहार का एक और खास मिला - प्रोफाइलर केवल यह गलत प्रारंभिक सेट का उपयोग करेगा, तो उस पैरामीटर के लिए इनपुट मूल्य, RPC कॉल में, Null था । यदि एक गैर-शून्य मान प्रदान किया गया था (और पैरामीटर, .Net SqlClient में, "इनपुट आउटपुट" दिशा थी), तब प्रारंभिक एसईटी में वास्तविक इनपुट मान होता है, न कि परिणामस्वरूप आउटपुट मान। लेकिन अगर इनपुट शून्य था, तो आउटपुट मान इसके बजाय सेट किया गया है। यह अवलोकन इस धारणा का समर्थन करता है कि यह प्रोफाइलर आरपीसी-टू-टीएसक्यूएल डिस्प्ले रूपांतरण में बस एक नल-हैंडलिंग बग है।