निदान: यदि आप किसी SQL Server 2008 में एक आम टेबल अभिव्यक्ति है कथन में चयन के आस-पास लघुकोष्ठक का उपयोग सही परिणाम


लक्षण


Microsoft SQL Server 2008 चला रहे कंप्यूटर पर, निम्न परिदृश्य पर विचार करें।

परिदृश्य 1

यदि आप किसी सामान्य तालिका अभिव्यक्ति (CTE) WITH कथन का उपयोग करके निर्दिष्ट करें। उदाहरण के लिए, आप निम्न क्वेरी चलाएँ।
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
उसके बाद, आप इस क्वेरी चलाएँ।
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
इस परिदृश्य में, इस क्वेरी के लिए कैश्ड क्वेरी योजना गलत statement_start_offset और statement_end_offset मान संग्रहीत करता है। विशेष रूप से, आप statement_end_offset मान statement_start_offset मान से कम है sys.dm_exec_query_stats डायनेमिक प्रबंधन दृश्य (DMV) चलाने पर ध्यान दें। इस समस्या के कारण, जब रिपोर्ट मानता statement_start_offset मान हमेशा statement_stop_offset मान से कम है कि है एक प्रदर्शन रिपोर्ट विफल हो सकता है।

परिदृश्य 2

आप WITH कथन का उपयोग करते हुए एक सामान्य तालिका अभिव्यक्ति निर्दिष्ट करें, और RECOMPILE विकल्प का उपयोग करें। उदाहरण के लिए, आप किसी फ़ंक्शन SQL Server 2008 में निम्न स्क्रिप्ट का उपयोग करके बनाएँ।
CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND
जब आप कोई "का चयन करें dbo.function1()" क्वेरी चलाते हैं, आपको निम्न त्रुटि संदेश प्राप्त होता है:
वर्तमान आदेश पर कोई गंभीर त्रुटि उत्पन्न हुई। परिणाम, यदि कोई हो, छोड़ दिया जाना चाहिए।
SQL सर्वर हेवी सर्वर यातायात का सामना कर रहा है, तो इसके साथ ही, यह त्रुटि बिना RECOMPILE विकल्प हो सकता है।

परिदृश्य 3

यदि आप किसी सामान्य तालिका अभिव्यक्ति WITH कथन का उपयोग करके निर्दिष्ट करें। WITH कथन में, किसी तालिका जो मौजूद नहीं है निर्दिष्ट करें। उदाहरण के लिए, आप निम्न क्वेरी चलाएँ।
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
जब आप इस क्वेरी चलाते हैं, तो आपको एक त्रुटि के लिए अनुपलब्ध तालिका नहीं मिलता है।

कारण


किसी दूषित संसाधन एक WITH कथन अनुवर्ती चयन कथन के कारण ये समस्याएँ उत्पन्न हो सकती है। WITH कथन निम्न सिंटैक्स का उपयोग करता है।
WITH common_table_expression AS(CTE_query_definition)
कोई परिणाम सेट जो निर्दिष्ट किया गया था जो सामान्य तालिका अभिव्यक्ति नाम करने के लिए असाइन किया गया है तब यह कथन बनाता है। उसके बाद, आप एक का चयन करें कथन के इस कथन का पालन करें। यदि कोष्ठक, में यह दूसरे कथन संलग्न है और उसके परिणाम पर कार्रवाई करने के लिए प्रयास करें या sys.dm_exec_query_stats डायनेमिक प्रबंधन दृश्य को चलाने के लिए प्रयास करें, तो आप गलत परिणाम या कोई त्रुटि प्राप्त होता है।

समाधान


सर्विस पैक जानकारीइस समस्या को हल करने के लिए, SQL Server 2008 के लिए नवीनतम सर्विस पैक प्राप्त करें। अधिक जानकारी के लिए Microsoft नॉलेज़ बेस में आलेख देखने के लिए निम्न आलेख संख्या पर क्लिक करें:
968382 SQL Server 2008 के लिए नवीनतम सर्विस पैक को प्राप्त करने के लिए कैसे

वैकल्पिक हल


इन समस्याओं के आस-पास काम करने के लिए, यदि आप कोष्ठक को सामान्य तालिका अभिव्यक्ति अनुवर्ती कथन से निकालने के लिए है। उदाहरण के लिए, निम्न कथन का उपयोग करता है ऐसा लघुकोष्ठक के साथ पर विचार करें।
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
इन समस्याओं के आस-पास काम करने के लिए, करने के लिए निम्न कथन जो उपयोग नहीं इन लघुकोष्ठक के साथ बदलें।
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

स्थिति


Microsoft ने पुष्टि की है कि यह "इन पर लागू" खण्ड में सूचीबद्ध Microsoft उत्पादों में एक समस्या है. यह समस्या सबसे पहले SQL Server 2008 सर्विस पैक 2 में (SP2) ठीक किया गया था।

अधिक जानकारी


WITH कथन के साथ एक सामान्य तालिका अभिव्यक्ति का उपयोग कैसे करें के बारे में अधिक जानकारी के लिए, निम्न MSDN वेब पेज पर जाएँ:Sys.dm_exec_query_stats के बारे में अधिक जानकारी के लिए, निम्न MSDN वेब पेज पर जाएँ: