<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQL Fool &#187; error handling</title>
	<atom:link href="http://sqlfool.com/tag/error-handling/feed/" rel="self" type="application/rss+xml" />
	<link>http://sqlfool.com</link>
	<description>Self-Professed SQL Scripting Junkie!</description>
	<lastBuildDate>Wed, 02 May 2012 21:25:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Error Handling in T-SQL</title>
		<link>http://sqlfool.com/2008/12/error-handling-in-t-sql/</link>
		<comments>http://sqlfool.com/2008/12/error-handling-in-t-sql/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 14:28:15 +0000</pubDate>
		<dc:creator>Michelle Ufford</dc:creator>
				<category><![CDATA[SQL 2008]]></category>
		<category><![CDATA[SQL Tips]]></category>
		<category><![CDATA[T-SQL Scripts]]></category>
		<category><![CDATA[error handling]]></category>

		<guid isPermaLink="false">http://sqlfool.com/?p=254</guid>
		<description><![CDATA[Error handling is one of those things in SQL Server that just doesn&#8217;t get the attention it deserves. Even a properly constructed stored procedure can still result in error, such as primary key or unique constraint errors. Why should you care? Consider this real-world example: You&#8217;re a DBA monitoring a well-performing environment. You deploy a [...]]]></description>
			<content:encoded><![CDATA[<p>Error handling is one of those things in SQL Server that just doesn&#8217;t get the attention it deserves.  Even a properly constructed stored procedure can still result in error, such as primary key or unique constraint errors.  </p>
<p>Why should you care?  Consider this real-world example: </p>
<p><em>
<p style="padding-left: 30px;">You&#8217;re a DBA monitoring a well-performing environment.  You deploy a new application to production.  Suddenly, performance degrades but you do not know why.  You look in your error log and see a whole mess of primary key errors.  Digging into your newly deployed application, you find that you are now making an extra (and unnecessary) insert to the database, which is resulting in error and causing your performance issues.</p>
<p></em></p>
<p>This is just one example of many.  Fortunately, SQL 2005 has really simplified the error handling process with features such as the Try/Catch block.</p>
<p>The basic components of error handling are:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ms175976.aspx" target="_blank">Try&#8230;Catch</a> block (2005/2008)</li>
<li>Error identification</li>
<li>Transaction handling</li>
<li>Error logging (optional)</li>
<li>Error notification</li>
</ul>
<p>As an early holiday gift, here&#8217;s a generic error handling process to get you started:</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">If</span> <span style="color: #FF00FF;">ObjectProperty</span><span style="color: #808080;">&#40;</span><span style="color: #FF00FF;">Object_ID</span><span style="color: #808080;">&#40;</span><span style="color: #FF0000;">'dbo.dba_logError_sp'</span><span style="color: #808080;">&#41;</span>, N<span style="color: #FF0000;">'IsProcedure'</span><span style="color: #808080;">&#41;</span> <span style="color: #808080;">=</span> <span style="color: #000;">1</span>
<span style="color: #0000FF;">Begin</span>
    <span style="color: #0000FF;">Drop</span> <span style="color: #0000FF;">Procedure</span> dbo.<span style="color: #202020;">dba_logError_sp</span>;
    <span style="color: #0000FF;">Print</span> <span style="color: #FF0000;">'Procedure dba_logError_sp dropped'</span>;
<span style="color: #0000FF;">End</span>;
Go
&nbsp;
<span style="color: #0000FF;">If</span> <span style="color: #FF00FF;">ObjectProperty</span><span style="color: #808080;">&#40;</span><span style="color: #FF00FF;">Object_ID</span><span style="color: #808080;">&#40;</span><span style="color: #FF0000;">'dbo.dba_errorLog'</span><span style="color: #808080;">&#41;</span>, N<span style="color: #FF0000;">'IsTable'</span><span style="color: #808080;">&#41;</span> <span style="color: #0000FF;">Is</span> Null
<span style="color: #0000FF;">Begin</span>
&nbsp;
    <span style="color: #0000FF;">Create</span> <span style="color: #0000FF;">Table</span> dbo.<span style="color: #202020;">dba_errorLog</span>
    <span style="color: #808080;">&#40;</span>         errorLog_id       <span style="color: #0000FF;">int</span> <span style="color: #0000FF;">identity</span><span style="color: #808080;">&#40;</span><span style="color: #000;">1</span>,<span style="color: #000;">1</span><span style="color: #808080;">&#41;</span> 
            , errorType         <span style="color: #0000FF;">char</span><span style="color: #808080;">&#40;</span><span style="color: #000;">3</span><span style="color: #808080;">&#41;</span>     
                <span style="color: #0000FF;">Constraint</span> <span style="color: #808080;">&#91;</span>DF_errorLog_errorType<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">Default</span> <span style="color: #FF0000;">'sys'</span> 
            , errorDate         <span style="color: #0000FF;">datetime</span>	
                <span style="color: #0000FF;">Constraint</span> <span style="color: #808080;">&#91;</span>DF_errorLog_errorDate<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">Default</span><span style="color: #808080;">&#40;</span><span style="color: #FF00FF;">GetDate</span><span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span><span style="color: #808080;">&#41;</span>
            , errorLine         <span style="color: #0000FF;">int</span>
            , errorMessage      <span style="color: #0000FF;">nvarchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">4000</span><span style="color: #808080;">&#41;</span>
            , errorNumber       <span style="color: #0000FF;">int</span>
            , errorProcedure    <span style="color: #0000FF;">nvarchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">126</span><span style="color: #808080;">&#41;</span>
            , procParameters    <span style="color: #0000FF;">nvarchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">4000</span><span style="color: #808080;">&#41;</span>
            , errorSeverity     <span style="color: #0000FF;">int</span>
            , errorState        <span style="color: #0000FF;">int</span>
            , databaseName      <span style="color: #0000FF;">nvarchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">255</span><span style="color: #808080;">&#41;</span>
        <span style="color: #0000FF;">Constraint</span> PK_errorLog_errorLogID <span style="color: #0000FF;">Primary</span> <span style="color: #0000FF;">Key</span> <span style="color: #0000FF;">Clustered</span>
        <span style="color: #808080;">&#40;</span>
            errorLog_id	
        <span style="color: #808080;">&#41;</span>
    <span style="color: #808080;">&#41;</span>;
&nbsp;
    <span style="color: #0000FF;">Print</span> <span style="color: #FF0000;">'Table dba_errorLog created'</span>;
&nbsp;
<span style="color: #0000FF;">End</span>;
Go
&nbsp;
&nbsp;
<span style="color: #0000FF;">Set</span> ANSI_Nulls <span style="color: #0000FF;">On</span>;
<span style="color: #0000FF;">Set</span> Ansi_Padding <span style="color: #0000FF;">On</span>;
<span style="color: #0000FF;">Set</span> Ansi_Warnings <span style="color: #0000FF;">On</span>;
<span style="color: #0000FF;">Set</span> ArithAbort <span style="color: #0000FF;">On</span>;
<span style="color: #0000FF;">Set</span> Concat_Null_Yields_Null <span style="color: #0000FF;">On</span>;
<span style="color: #0000FF;">Set</span> <span style="color: #0000FF;">NoCount</span> <span style="color: #0000FF;">On</span>;
<span style="color: #0000FF;">Set</span> Numeric_RoundAbort <span style="color: #0000FF;">Off</span>;
<span style="color: #0000FF;">Set</span> Quoted_Identifier <span style="color: #0000FF;">On</span>;
Go
&nbsp;
<span style="color: #0000FF;">Create</span> <span style="color: #0000FF;">Procedure</span> dbo.<span style="color: #202020;">dba_logError_sp</span>
<span style="color: #808080;">&#40;</span>
    <span style="color: #008080;">/* Declare Parameters */</span>
      @errorType            <span style="color: #0000FF;">char</span><span style="color: #808080;">&#40;</span><span style="color: #000;">3</span><span style="color: #808080;">&#41;</span>         <span style="color: #808080;">=</span> <span style="color: #FF0000;">'sys'</span>
    , @app_errorProcedure   <span style="color: #0000FF;">varchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">50</span><span style="color: #808080;">&#41;</span>     <span style="color: #808080;">=</span> <span style="color: #FF0000;">''</span>
    , @app_errorMessage     <span style="color: #0000FF;">nvarchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">4000</span><span style="color: #808080;">&#41;</span>  <span style="color: #808080;">=</span> <span style="color: #FF0000;">''</span>
    , @procParameters       <span style="color: #0000FF;">nvarchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">4000</span><span style="color: #808080;">&#41;</span>  <span style="color: #808080;">=</span> <span style="color: #FF0000;">''</span>
    , @userFriendly         <span style="color: #0000FF;">bit</span>             <span style="color: #808080;">=</span> <span style="color: #000;">0</span>
    , @forceExit            <span style="color: #0000FF;">bit</span>             <span style="color: #808080;">=</span> <span style="color: #000;">1</span>
    , @returnError          <span style="color: #0000FF;">bit</span>             <span style="color: #808080;">=</span> <span style="color: #000;">1</span>
<span style="color: #808080;">&#41;</span>
<span style="color: #0000FF;">As</span>
<span style="color: #008080;">/***************************************************************
    Name:       dba_logError_sp
&nbsp;
    Author:     Michelle F. Ufford, http://sqlfool.com
&nbsp;
    Purpose:    Retrieves error information and logs in the 
                        dba_errorLog table.
&nbsp;
        @errorType = options are &quot;app&quot; or &quot;sys&quot;; &quot;app&quot; are custom 
                application errors, i.e. business logic errors;
                &quot;sys&quot; are system errors, i.e. PK errors
&nbsp;
        @app_errorProcedure = stored procedure name, 
                needed for app errors
&nbsp;
        @app_errorMessage = custom app error message
&nbsp;
        @procParameters = optional; log the parameters that were passed
                to the proc that resulted in an error
&nbsp;
        @userFriendly = displays a generic error message if = 1
&nbsp;
        @forceExit = forces the proc to rollback and exit; 
                mostly useful for application errors.
&nbsp;
        @returnError = returns the error to the calling app if = 1
&nbsp;
    Called by:	Another stored procedure
&nbsp;
    Date        Initials    Description
	----------------------------------------------------------------------------
    2008-12-16  MFU         Initial Release
****************************************************************
    Exec dbo.dba_logError_sp
        @errorType          = 'app'
      , @app_errorProcedure = 'someTableInsertProcName'
      , @app_errorMessage   = 'Some app-specific error message'
      , @userFriendly       = 1
      , @forceExit          = 1
      , @returnError        = 1;
****************************************************************/</span>
&nbsp;
<span style="color: #0000FF;">Set</span> <span style="color: #0000FF;">NoCount</span> <span style="color: #0000FF;">On</span>;
<span style="color: #0000FF;">Set</span> XACT_Abort <span style="color: #0000FF;">On</span>;
&nbsp;
<span style="color: #0000FF;">Begin</span>
&nbsp;
    <span style="color: #008080;">/* Declare Variables */</span>
    <span style="color: #0000FF;">Declare</span>	@errorNumber            <span style="color: #0000FF;">int</span>
            , @errorProcedure       <span style="color: #0000FF;">varchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">50</span><span style="color: #808080;">&#41;</span>
            , @dbName               sysname
            , @errorLine            <span style="color: #0000FF;">int</span>
            , @errorMessage         <span style="color: #0000FF;">nvarchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">4000</span><span style="color: #808080;">&#41;</span>
            , @errorSeverity        <span style="color: #0000FF;">int</span>
            , @errorState           <span style="color: #0000FF;">int</span>
            , @errorReturnMessage   <span style="color: #0000FF;">nvarchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">4000</span><span style="color: #808080;">&#41;</span>
            , @errorReturnSeverity  <span style="color: #0000FF;">int</span>
            , @currentDateTime      <span style="color: #0000FF;">smalldatetime</span>;
&nbsp;
    <span style="color: #0000FF;">Declare</span> @errorReturnID <span style="color: #0000FF;">Table</span> <span style="color: #808080;">&#40;</span>errorID <span style="color: #0000FF;">varchar</span><span style="color: #808080;">&#40;</span><span style="color: #000;">10</span><span style="color: #808080;">&#41;</span><span style="color: #808080;">&#41;</span>;
&nbsp;
    <span style="color: #008080;">/* Initialize Variables */</span>
    <span style="color: #0000FF;">Select</span> @currentDateTime <span style="color: #808080;">=</span> <span style="color: #FF00FF;">GetDate</span><span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span>;
&nbsp;
    <span style="color: #008080;">/* Capture our error details */</span>
    <span style="color: #0000FF;">If</span> @errorType <span style="color: #808080;">=</span> <span style="color: #FF0000;">'sys'</span> 
    <span style="color: #0000FF;">Begin</span>
&nbsp;
        <span style="color: #008080;">/* Get our system error details and hold it */</span>
        <span style="color: #0000FF;">Select</span> 
              @errorNumber      <span style="color: #808080;">=</span> Error_Number<span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span>
            , @errorProcedure   <span style="color: #808080;">=</span> Error_Procedure<span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span>
            , @dbName           <span style="color: #808080;">=</span> <span style="color: #FF00FF;">DB_Name</span><span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span>
            , @errorLine        <span style="color: #808080;">=</span> Error_Line<span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span>
            , @errorMessage     <span style="color: #808080;">=</span> Error_Message<span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span>
            , @errorSeverity    <span style="color: #808080;">=</span> Error_Severity<span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span>
            , @errorState       <span style="color: #808080;">=</span> Error_State<span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span> ;
&nbsp;
    <span style="color: #0000FF;">End</span>
    <span style="color: #0000FF;">Else</span>
    <span style="color: #0000FF;">Begin</span>
&nbsp;
    	<span style="color: #008080;">/* Get our custom app error details and hold it */</span>
        <span style="color: #0000FF;">Select</span> 
              @errorNumber      <span style="color: #808080;">=</span> <span style="color: #000;">0</span>
            , @errorProcedure   <span style="color: #808080;">=</span> @app_errorProcedure
            , @dbName           <span style="color: #808080;">=</span> <span style="color: #FF00FF;">DB_Name</span><span style="color: #808080;">&#40;</span><span style="color: #808080;">&#41;</span>
            , @errorLine        <span style="color: #808080;">=</span> <span style="color: #000;">0</span>
            , @errorMessage     <span style="color: #808080;">=</span> @app_errorMessage
            , @errorSeverity    <span style="color: #808080;">=</span> <span style="color: #000;">0</span>
            , @errorState       <span style="color: #808080;">=</span> <span style="color: #000;">0</span> ;
&nbsp;
    <span style="color: #0000FF;">End</span>;
&nbsp;
    <span style="color: #008080;">/* And keep a copy for our logs */</span>
    <span style="color: #0000FF;">Insert</span> <span style="color: #0000FF;">Into</span> dbo.<span style="color: #202020;">dba_errorLog</span>
    <span style="color: #808080;">&#40;</span>
          errorType
        , errorDate
        , errorLine
        , errorMessage
        , errorNumber
        , errorProcedure
        , procParameters
        , errorSeverity
        , errorState
        , databaseName
	<span style="color: #808080;">&#41;</span>
    <span style="color: #0000FF;">OutPut</span> Inserted.<span style="color: #202020;">errorLog_id</span> <span style="color: #0000FF;">Into</span> @errorReturnID
    <span style="color: #0000FF;">Values</span>
    <span style="color: #808080;">&#40;</span>
          @errorType
        , @currentDateTime
        , @errorLine
        , @errorMessage
        , @errorNumber
        , @errorProcedure
        , @procParameters
        , @errorSeverity
        , @errorState
        , @dbName
    <span style="color: #808080;">&#41;</span>;
&nbsp;
    <span style="color: #008080;">/* Should we display a user friendly message to the application? */</span>
    <span style="color: #0000FF;">If</span> @userFriendly <span style="color: #808080;">=</span> <span style="color: #000;">1</span>
        <span style="color: #0000FF;">Select</span> @errorReturnMessage <span style="color: #808080;">=</span> <span style="color: #FF0000;">'An error has occurred in the database ('</span> <span style="color: #808080;">+</span> errorID <span style="color: #808080;">+</span> <span style="color: #FF0000;">')'</span>
        <span style="color: #0000FF;">From</span> @errorReturnID;
    <span style="color: #0000FF;">Else</span> 
        <span style="color: #0000FF;">Select</span> @errorReturnMessage <span style="color: #808080;">=</span> @errorMessage;
&nbsp;
    <span style="color: #008080;">/* Do we want to force the application to exit? */</span>
    <span style="color: #0000FF;">If</span> @forceExit <span style="color: #808080;">=</span> <span style="color: #000;">1</span>
        <span style="color: #0000FF;">Select</span> @errorReturnSeverity <span style="color: #808080;">=</span> <span style="color: #000;">15</span>
    <span style="color: #0000FF;">Else</span>
        <span style="color: #0000FF;">Select</span> @errorReturnSeverity <span style="color: #808080;">=</span> @errorSeverity;
&nbsp;
    <span style="color: #008080;">/* Should we return an error message to the calling proc? */</span>
    <span style="color: #0000FF;">If</span> @returnError <span style="color: #808080;">=</span> <span style="color: #000;">1</span>
        <span style="color: #0000FF;">Raiserror</span> 
        <span style="color: #808080;">&#40;</span>
              @errorReturnMessage
            , @errorReturnSeverity
            , <span style="color: #000;">1</span>
        <span style="color: #808080;">&#41;</span> <span style="color: #0000FF;">With</span> NoWait;
&nbsp;
    <span style="color: #0000FF;">Set</span> <span style="color: #0000FF;">NoCount</span> <span style="color: #0000FF;">Off</span>;
    <span style="color: #0000FF;">Return</span> <span style="color: #000;">0</span>;
&nbsp;
<span style="color: #0000FF;">End</span>
Go</pre></div></div>

</p>
<p>&nbsp;</p>
<p>You would then call this proc in the following manner:</p>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">Begin</span> Try
&nbsp;
    <span style="color: #008080;">/* If a business logic error exists, then call this proc */</span>
    <span style="color: #0000FF;">If</span> <span style="color: #000;">1</span> <span style="color: #808080;">!=</span> <span style="color: #000;">1</span>
        <span style="color: #0000FF;">Execute</span> dbo.<span style="color: #202020;">dba_logError_sp</span> 
              @errorType            <span style="color: #808080;">=</span> <span style="color: #FF0000;">'app'</span>
            , @app_errorProcedure   <span style="color: #808080;">=</span> <span style="color: #FF0000;">'yourStoredProcedureName'</span>
            , @app_errorMessage     <span style="color: #808080;">=</span> <span style="color: #FF0000;">'1 does not equal 1!'</span>
            , @forceExit            <span style="color: #808080;">=</span> <span style="color: #000;">1</span>;
&nbsp;
    <span style="color: #008080;">/* Start a new transaction */</span>
    <span style="color: #0000FF;">Begin</span> <span style="color: #0000FF;">Transaction</span>;  
&nbsp;
    <span style="color: #008080;">/* Do something */</span>
&nbsp;
    <span style="color: #008080;">/* If you have an open transaction, commit it */</span>
    <span style="color: #0000FF;">If</span> <span style="color: #FF00FF;">@@TranCount</span> <span style="color: #808080;">&gt;</span> <span style="color: #000;">0</span>
        <span style="color: #0000FF;">Commit</span> <span style="color: #0000FF;">Transaction</span>;
&nbsp;
<span style="color: #0000FF;">End</span> Try
<span style="color: #0000FF;">Begin</span> Catch
&nbsp;
    <span style="color: #008080;">/* Whoops, there was an error... rollback! */</span>
    <span style="color: #0000FF;">If</span> <span style="color: #FF00FF;">@@TranCount</span> <span style="color: #808080;">&gt;</span> <span style="color: #000;">0</span>
        <span style="color: #0000FF;">Rollback</span> <span style="color: #0000FF;">Transaction</span>;
&nbsp;
    <span style="color: #008080;">/* Grab our proc parameters */</span>
    <span style="color: #0000FF;">Set</span> @errorParameters <span style="color: #808080;">=</span> <span style="color: #FF0000;">'@myVariable = '</span> <span style="color: #808080;">+</span> @myVariable;
&nbsp;
    <span style="color: #008080;">/* Return an error message and log it */</span>
    <span style="color: #0000FF;">Execute</span> dbo.<span style="color: #202020;">dba_logError_sp</span>
        @procParameters <span style="color: #808080;">=</span> @errorParameters;
&nbsp;
<span style="color: #0000FF;">End</span> Catch;</pre></div></div>

<p>&nbsp;</p>
<p>Some things to keep in mind:</p>
<ul>
<li>Error handling is not a &#8220;one-size-fits-all&#8221; process.  Make sure you&#8217;re handling the error appropriately for your environment.</li>
<li>Be careful when working with nested transactions; you can sometimes get unexpected results.</li>
<li>Only errors with a severity levels greater than 10 will be caught by the Catch block.  </li>
<li>You can initiate an error within your stored procedure by using <a href="http://msdn.microsoft.com/en-us/library/ms178592.aspx" target="_blank">RaisError</a>().</li>
</ul>
<p>Happy <span style="text-decoration: line-through;">coding</span> holidays!  <img src='http://sqlfool.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sqlfool.com/2008/12/error-handling-in-t-sql/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

