2012-11-30 12 views
6

Utilizzo SQL Server 2005. Ho creato una stored procedure che funziona la maggior parte del tempo, ma ho trovato un'istanza in cui non fa ciò che voglio.Come ottenere l'errore sql nella stored procedure

Attualmente, il codice fa qualcosa di simile

if @@error <> 0 
    begin 
    select @message_error = "There was a database error adding product "+ @product + " to product line 
    end 

Dove @message_error è una variabile di uscita.

Quindi, posso select @@error e ottenere un numero, ma tutto quello che voglio veramente è l'errore SQL.

Qualcosa come Ehi, non potrei farlo perché c'è un limite fk su questa colonna o qualsiasi altra cosa. Ho trovato questo articolo su MSDN http://msdn.microsoft.com/en-us/library/ms178592(v=sql.90).aspx

ma va solo su gettando eccezioni personalizzate con RAISERROR, io non voglio creare il mio messaggio di errore o eccezione, voglio solo sapere perché roba non sta funzionando. Posso eseguire la stored procedure attraverso Management Studio e vedere l'errore SQL esatto, ma è noioso cercare di abbinare i dati dal sito e inserirli manualmente in quel modo.

Come si ottiene il testo dell'errore SQL in una variabile di uscita?

+2

Hai guardato su ERROR_MESSAGE http://msdn.microsoft.com/en-us/library/ms190358.aspx? – Romhein

risposta

11

Ecco parte di un modello di stored procedure che uso: blocchi

/* CREATE PROCEDURE... */ 

DECLARE 
    @ErrorMessage varchar(2000) 
,@ErrorSeverity tinyint 
,@ErrorState  tinyint 

/* Additional code */ 

BEGIN TRY 

/* Your code here */ 

END TRY 

BEGIN CATCH 
    SET @ErrorMessage = ERROR_MESSAGE() 
    SET @ErrorSeverity = ERROR_SEVERITY() 
    SET @ErrorState = ERROR_STATE() 
    RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState) 

    BREAK 
END CATCH 

/* Further cleanup code */ 

try/catch può essere difficile, ma sono molto più approfondita rispetto @@ errore. Ancora più importante, è possibile utilizzare le varie funzioni error_xxx() al loro interno. Qui, memorizzo il messaggio di errore corretto nella variabile @ErrorMessage, insieme a abbastanza altri dati per sollevare nuovamente l'errore. Da qui, sono disponibili un numero qualsiasi di opzioni; puoi rendere @ErrorMessage una variabile di output, testare e gestire errori specifici, o creare i tuoi propri messaggi di errore (o aggiustare quelli esistenti per essere più chiari - potresti irritarti a scoprire quante volte vorresti farlo). Altre opzioni presenteranno themsleves.

Qualcosa da guardare fuori per: in alcune situazioni, SQL getterà due messaggi di errore back to back ... e error_message() prenderà solo l'ultimo, che di solito dice qualcosa come "tentativo di creare l'oggetto non riuscita", con la errore reale dato nel primo messaggio di errore. Qui è dove entra in gioco il tuo messaggio di errore.

+0

Questa è davvero una grande risposta, e non posso credere di averlo trascurato quando ho inizialmente accettato una risposta. Grazie! –

+0

Io chiamo 'Error_Message()' su un altro server ma diventa NULL !!? Avere modo di rilevare errori sul server A da un server Sp sul server B. in questo modello quando un errore generato sul server A, nel blocco Catch del server A chiama un SP dal server B. ma non funziona! perché ? – Behzad

+0

@Khosravifar, questo è un problema abbastanza complesso che dovresti davvero postarlo come una sua domanda - e aggiungere un link ad esso qui come commento. –

9

È possibile utilizzare un Try/Catch generale e quindi creare ulteriori dettagli sull'errore all'interno della sezione CATCH, ad es.

DECLARE @DetailedErrorDesc VARCHAR(MAX) 
BEGIN TRY 

--tsql code goes here 

END TRY 
BEGIN CATCH 

SELECT @DetailedErrorDesc =   
    CAST(ERROR_NUMBER() AS VARCHAR) + ' : '+ 
    CAST(ERROR_SEVERITY() AS VARCHAR) + ' : ' + 
    CAST(ERROR_STATE() AS VARCHAR) + ' : ' + 
    ERROR_PROCEDURE() + ' : ' + 
    ERROR_MESSAGE() + ' : ' + 
    CAST(ERROR_LINE() AS VARCHAR); 

--Now you can decide what to do with the detailed error message....return it or log it etc 

END CATCH 
+0

Incredibile! Grazie!! –

3

uso try ... catch e blocco catch è possibile utilizzare ERROR_MESSAGE(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_STATE(), ERROR_SEVERITY(), ERROR_NUMBER() Funzioni

Problemi correlati