Hai trovato una delle parti più fastidiose di SQL Server. Esistono situazioni in cui è possibile generare un errore e SQL genera due messaggi di errore: il primo per spiegare l'errore e il secondo per dire qualcosa di utile come "L'istruzione è stata terminata" (che, tecnicamente, è il numero dell'errore 3621). Il fatto è che SQL, e quasi tutto ciò che lo tocca - come PHP - può solo vedere/raccogliere/elaborare/o utilizzare in altro modo l'ultimo messaggio di errore unlcear. Quello che è effettivamente utile si perde.
Il modo rapido per capire cosa sta succedendo è eseguire la sequenza di comandi che portano all'errore da SSMS. Questo, a quanto pare, non funzionerà per te.
Un modo più faticoso di capirlo è attivare SQL Profiler per tracciare l'evento Exception e quindi eseguire il processo. Questo dovrebbe mostrare tutti gli errori che si sono verificati. Lancio in altri eventi rilevanti (SP: Starting, SP: StmtStarting, SQL: BatchStarting, qualunque cosa sia applicabile al codice che si sta inviando al database) mostrerà quale comando sta generando l'errore.
fonte
2010-06-16 13:48:52
Quindi con il tuo esempio, se rilevo il messaggio "La dichiarazione è stata terminata" dovrei essere in grado di inviare la query che hai fornito per ottenere il codice di errore? –
Non importa, la tua soluzione in teoria suona bene. Tuttavia, la variabile @@ ERROR verrà sovrascritta se un'altra query raggiunge il database prima che sia possibile interrogarla. Su un server occupato questo è altamente probabile. –
Il problema riscontrato è apparentemente un problema noto con il driver mssql. Guarda http://php.net/manual/en/function.mssql-get-last-message.php, specialmente i commenti in fondo.La gente ha lottato con questo problema per molto tempo. – Gary