Skip to content

shannonlowder.com

Menu
  • About
  • Biml Interrogator Demo
  • Latest Posts
Menu

Return a Success/Failure to a Job based on a SQL query?

Posted on January 18, 2008May 18, 2010 by slowder

Over on Experts Exchange, someone posted a question I felt I could answer.  The user posted a question on how to return a failure and not run a job.  I originally took the approach of putting a query at the top of the queries run by the job that would query the table of failure dates, and if today wasn’t in that table, it would run the step.  The problem with my approach is it didn’t fit with the way the user requested it work.

Another contributor offered a suggestion to use the RAISERROR function.  This is a great function that if you haven’t used yet, you just might think of some by the time you reach the end of this article.

Let’s look at a simple use of the RAISERROR.

IF ( SELECT SUM(errors) FROM errorTable) > 0
   RAISERROR (
        'You have too many errors.' -- Message text.
      , 16 -- Severity.
      , 1 -- State
   )

In this case we have table, errorTable, that we add records to as we discover errors.  Later we run a query that counts the number of errors that have been entered into our errorTable.  In this case, if the number of errors is greater than 0, we need to stop what we’re doing and report back to the client, there were too many errors found.

The IF statement should be straightforward, if not, please check out the archives for articles covering IF .. THEN statements in SQL.  What is new is the RAISERROR.  The basic three parameters this function takes are message text, severity, and state.

The message text is simple, this is just a string that will be returned to the user if this point in the code is reached.  The severity is a little more difficult to explain.  Severity can be any small int between 0 and 25.  20 through 25 are considered fatal, and you need to understand how your SQL server is going to respond to those before throwing an error with that severity level.

If a fatal severity level is encountered, the client connection is terminated after receiving the message, and the error is logged in the error and application logs.

That leaves us a range of 0 – 19 that we can use.  I generally use 11 when I’m trying to stop a job or a DTS package.  You will have to experiment with this to learn what severity level you want to use and when.  I try to use the minimum severity that responds appropriately to the business need of the error.

Finally, we have state.  This is another smallint between 0 and 255.  This is an identifier you get to choose, to help you locate where in your code the error was found.  I usually increment from 0 to however many states I need in order to uniquely identify each break point in my code.  I suggest you do the same.

As always, learning the RAISERROR command is easy.  Mastering it’s use will take more time.  I’m sure every one of you have built a stored procedure or some segment of code, that you would like to detect for an error case, and if found, stop processing at that point, right?  This is the perfect solution for that case.  I suggest plenty of testing in your development environment before rolling out a new RAISERROR… if only to be sure of how your code will respond!

If you have any questions on this command or any other, send them in!  I’m always here to help answer any questions you may have about SQL.

References

  • RAISERROR

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • A New File Interrogator
  • Using Generative AI in Data Engineering
  • Getting started with Microsoft Fabric
  • Docker-based Spark
  • Network Infrastructure Updates

Recent Comments

  1. slowder on Data Engineering for Databricks
  2. Alex Ott on Data Engineering for Databricks

Archives

  • July 2023
  • June 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • October 2018
  • August 2018
  • May 2018
  • February 2018
  • January 2018
  • November 2017
  • October 2017
  • September 2017
  • August 2017
  • June 2017
  • March 2017
  • February 2014
  • January 2014
  • December 2013
  • November 2013
  • October 2013
  • August 2013
  • July 2013
  • June 2013
  • February 2013
  • January 2013
  • August 2012
  • June 2012
  • May 2012
  • April 2012
  • March 2012
  • February 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • August 2011
  • July 2011
  • June 2011
  • May 2011
  • April 2011
  • March 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • August 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • September 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • April 2009
  • March 2009
  • February 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • September 2008
  • August 2008
  • July 2008
  • June 2008
  • May 2008
  • April 2008
  • March 2008
  • February 2008
  • January 2008
  • November 2007
  • October 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007
  • February 2007
  • January 2007
  • December 2006
  • November 2006
  • October 2006
  • September 2006
  • August 2006
  • July 2006
  • June 2006
  • May 2006
  • April 2006
  • March 2006
  • February 2006
  • January 2006
  • December 2005
  • November 2005
  • October 2005
  • September 2005
  • August 2005
  • July 2005
  • June 2005
  • May 2005
  • April 2005
  • March 2005
  • February 2005
  • January 2005
  • November 2004
  • September 2004
  • August 2004
  • July 2004
  • April 2004
  • March 2004
  • June 2002

Categories

  • Career Development
  • Data Engineering
  • Data Science
  • Infrastructure
  • Microsoft SQL
  • Modern Data Estate
  • Personal
  • Random Technology
  • uncategorized
© 2025 shannonlowder.com | Powered by Minimalist Blog WordPress Theme