2010-06-16 6 views
6

Ich habe eine sehr einfache INSERT-Anweisung ausgeführt von einem PHP-Skript auf einem Linux-Apache-Webserver ausgeführt. Ich kann die Abfrage innerhalb von SQL Management Studio ausführen und es läuft normalerweise auch gut von PHP. Hin und wieder bekomme ich jedoch eine Fehlermeldung von meinem PHP-Skript, dass die Abfrage fehlgeschlagen ist und die mssql_get_last_message() - Funktion 'Die Anweisung wurde beendet' zurückgibt.Was bewirkt, dass SQL Server die Nachricht 'Die Anweisung wurde beendet' zurückgibt?

Welche Quellen können dazu führen, dass diese Nachricht von SQL Server zurückgegeben wird?

Antwort

11

Sie haben eine der nervigsten Teile von SQL Server gefunden. Es gibt Situationen, in denen ein Fehler ausgelöst werden kann, und SQL generiert zwei Fehlermeldungen: die erste, um zu erklären, was der Fehler war, und die zweite, um etwas Nützliches zu sagen, wie "Die Anweisung wurde beendet" (was technisch die Fehlernummer ist 3621). Die Sache ist, dass SQL und die meisten anderen Dinge, die es betreffen - wie PHP - diese letzte Fehlermeldung nur sehen/aufnehmen/verarbeiten/anderweitig nutzen können. Die eine, die wirklich nützlich ist, geht verloren.

Der schnelle Weg, um herauszufinden, was vor sich geht, ist, die Folge von Befehlen zu führen, die zu dem Fehler von SSMS führen. Dies wird anscheinend nicht für Sie funktionieren.

Eine einfachere Möglichkeit, das herauszufinden, besteht darin, SQL Profiler zu starten, um das Exception-Ereignis zu verfolgen und dann den Prozess auszuführen. Dies sollte alle Fehler anzeigen, die aufgetreten sind. Das Einbringen relevanter anderer Ereignisse (SP: Start, SP: StmtStarting, SQL: BatchStarting, was immer für den Code gilt, den Sie an die Datenbank senden) zeigt an, welcher Befehl den Fehler verursacht.

1

Um einen numerischen Fehlercode aus mssql erhalten Sie eine Auswahl tun können, dass so etwas wie

SELECT @@ ERROR AS ErrorCode-
sieht, die den richtigen Fehlercode zurückgeben sollte.

Sie können auch diesen Code versuchen, der auf PHP.NET gepostet wird.

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

Also, mit Ihrem Beispiel, wenn ich meine 'Die Anweisung wurde beendet' Nachricht sollte ich in der Lage sein, die Abfrage, die Sie zur Verfügung gestellt, um den Fehlercode erhalten? –

+0

Nevermind, klingt Ihre Lösung in der Theorie gut. Die Variable @@ ERROR wird jedoch überschrieben, wenn eine andere Abfrage die Datenbank trifft, bevor Sie sie abfragen können. Auf einem ausgelasteten Server ist dies sehr wahrscheinlich. –

+0

Das Problem, das Sie haben, ist ein bekanntes Problem mit dem mssql-Treiber anscheinend. Sehen Sie sich http://php.net/manual/en/function.mssql-get-last-message.php an, besonders die Kommentare unten.Die Leute haben lange mit diesem Problem gekämpft. – Gary

0

Sie können den Code in der Nachricht verwenden, um zu wissen, um welchen Fehler es sich handelt. Zum Beispiel:

[2627. Die Anweisung wurde beendet]

In diesem Fall wird der Fehlercode 2627, also wenn Sie die SQL ausführen unten die Meldung wissen werde

Verstoß gegen% ls Einschränkung '%. * Ls'. Kann keinen doppelten Schlüssel in Objekt '%. * Ls' einfügen. Der doppelte Schlüsselwert ist% ls.

Dies ist eine Möglichkeit, den richtigen Nachrichtenfehler zu kennen. In meinem Beispiel ist der Fehler eine Verletzung des Primärschlüssels

Verwandte Themen