2010-06-16 13 views
6

मेरे पास एक बहुत ही सरल INSERT कथन है जो एक लिनक्स अपाचे वेब सर्वर पर चल रही एक PHP स्क्रिप्ट से निष्पादित किया जा रहा है। मैं SQL प्रबंधन स्टूडियो के भीतर क्वेरी ठीक से चला सकता हूं और यह आमतौर पर PHP से भी ठीक चलता है। हालांकि, हर बार थोड़ी देर में मुझे अपनी PHP स्क्रिप्ट से एक त्रुटि संदेश मिलता है कि क्वेरी विफल हुई और mssql_get_last_message() फ़ंक्शन रिटर्न 'कथन समाप्त कर दिया गया है'।SQL सर्वर संदेश को वापस करने का कारण क्या है 'कथन समाप्त कर दिया गया है'?

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

उत्तर

11

आपको SQL सर्वर के सबसे कष्टप्रद हिस्सों में से एक मिला है। ऐसी परिस्थितियां हैं जहां एक त्रुटि उठाई जा सकती है, और एसक्यूएल दो त्रुटि संदेशों को उत्पन्न करेगा: पहली बार यह समझाने के लिए कि त्रुटि क्या थी, और दूसरा कुछ उपयोगी कहने के लिए "कथन समाप्त कर दिया गया है" (जो तकनीकी रूप से त्रुटि संख्या है 3621)। बात यह है कि एसक्यूएल, और अधिकांश चीजें जो इसे छूती हैं - जैसे कि PHP - केवल अंतिम अनदेखी त्रुटि संदेश को देख/उठा/प्रक्रिया/या अन्यथा उपयोग कर सकती है। जो वास्तव में उपयोगी है वह खो जाता है।

एसएसएमएस से त्रुटि तक पहुंचने वाले आदेशों के अनुक्रम को चलाने के लिए क्या हो रहा है यह जानने का त्वरित तरीका है। जाहिर है, यह आपके लिए काम नहीं करेगा।

इसे समझने का एक अच्छा तरीका अपवाद घटना को ट्रैक करने के लिए एसक्यूएल प्रोफाइलर को आग लगाना है, और फिर अपनी प्रक्रिया को चलाने के लिए है। यह होने वाली सभी त्रुटियों को दिखाना चाहिए। प्रासंगिक अन्य घटनाओं में टॉसिंग (एसपी: प्रारंभ, एसपी: StmtStarting, एसक्यूएल: बैचस्टार्टिंग, जो भी आपके डेटाबेस में सबमिट कोड पर लागू होता है) दिखाएगा कि कौन सा आदेश त्रुटि को उठा रहा है।

1

एक संख्यात्मक त्रुटि कोड mssql से आप की तरह

चयन @@ त्रुटि ERRORCODE
के रूप में कौन सा चाहिए सही त्रुटि कोड दिखता है कि एक का चयन कर सकते हैं पाने के लिए।

आप इस कोड को भी PHP.NET पर पोस्ट कर सकते हैं।

function query($sQuery, $hDb_conn, $sError, $bDebug) 
{ 
    if(!$rQuery = @mssql_query($sQuery, $hDb_conn)) 
    { 
     $sMssql_get_last_message = mssql_get_last_message(); 
     $sQuery_added = "BEGIN TRY\n"; 
     $sQuery_added .= "\t".$sQuery."\n"; 
     $sQuery_added .= "END TRY\n"; 
     $sQuery_added .= "BEGIN CATCH\n"; 
     $sQuery_added .= "\tSELECT 'Error: ' + ERROR_MESSAGE()\n"; 
     $sQuery_added .= "END CATCH"; 
     $rRun2= @mssql_query($sQuery_added, $hDb_conn); 
     $aReturn = @mssql_fetch_assoc($rRun2); 
     if(empty($aReturn)) 
     { 
      echo $sError.'. MSSQL returned: '.$sMssql_get_last_message.'.<br>Executed query: '.nl2br($sQuery); 
     } 
     elseif(isset($aReturn['computed'])) 
     { 
      echo $sError.'. MSSQL returned: '.$aReturn['computed'].'.<br>Executed query: '.nl2br($sQuery); 
     } 
     return FALSE; 
    } 
    else 
    { 
     return $rQuery; 
    } 
} 
+0

का उल्लंघन है तो आपके उदाहरण के साथ, यदि मुझे पता चलता है कि 'कथन समाप्त कर दिया गया है' संदेश मैं त्रुटि कोड प्राप्त करने के लिए प्रदान की गई क्वेरी सबमिट करने में सक्षम होना चाहिए? –

+0

कभी नहीं, सिद्धांत में आपका समाधान अच्छा लगता है। हालांकि, @@ ERROR वैरिएबल को ओवरराइट किया जाएगा यदि आपके पास क्वेरी करने का मौका मिलने से पहले कोई अन्य क्वेरी डेटाबेस को हिट करती है। एक व्यस्त सर्वर पर यह अत्यधिक संभावना है। –

+0

आपके पास जो मुद्दा है वह mssql ड्राइवर के साथ एक ज्ञात समस्या है। Http://php.net/manual/en/function.mssql-get-last-message.php पर विशेष रूप से टिप्पणियों को देखें।लोग इस मुद्दे के साथ लंबे समय से संघर्ष कर रहे हैं। – Gary

0

आप यह जानने के लिए संदेश में कोड का उपयोग कर सकते हैं कि त्रुटि क्या है। उदाहरण के लिए:

[2627:। बयान समाप्त कर दिया गया]

इस मामले में, त्रुटि कोड, 2627 है, इसलिए यदि आप एसक्यूएल निष्पादित नीचे आप संदेश मिल जाएगा

SELECT msg.text 
    FROM sys.messages msg 
INNER JOIN sys.syslanguages lng ON lng.msglangid = msg.language_id 
WHERE msg.message_id = 2627 
    AND lng.alias = 'English' 

% ls constraint '%। * Ls' का उल्लंघन। ऑब्जेक्ट '%। * Ls' में डुप्लिकेट कुंजी सम्मिलित नहीं कर सकता। डुप्लिकेट कुंजी मान% ls है।

यह सही संदेश त्रुटि जानने का एक तरीका है। मेरे उदाहरण में त्रुटि प्राथमिक कुंजी

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

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