I have a stored procedure that does some parameter validation and should fail and stop execution if the parameter is not valid.
My first approach for error checking looked like this:
create proc spBaz ( @fooInt int = 0, @fooString varchar(10) = null, @barInt int = 0, @barString varchar(10) = null ) as begin if (@fooInt = 0 and (@fooString is null or @fooString = '')) raiserror('invalid parameter: foo', 18, 0) if (@barInt = 0 and (@barString is null or @barString = '')) raiserror('invalid parameter: bar', 18, 0) print 'validation succeeded' -- do some work end
This didn't do the trick since severity 18 doesn't stop the execution and 'validation succeeded' is printed together with the error messages.
I know I could simply add a return after every raiserror but this looks kind of ugly to me:
if (@fooInt = 0 and (@fooString is null or @fooString = '')) begin raiserror('invalid parameter: foo', 18, 0) return end ... print 'validation succeeded' -- do some work
Since errors with severity 11 and higher are caught within a try/catch block another approach I tested was to encapsulate my error checking inside such a try/catch block. The problem was that the error was swallowed and not sent to the client at all. So I did some research and found a way to rethrow the error:
begin try if (@fooInt = 0 and (@fooString is null or @fooString = '')) raiserror('invalid parameter: foo', 18, 0) ... end try begin catch exec usp_RethrowError return end catch print 'validation succeeded' -- do some work
I'm still not happy with this approach so I'm asking you:
How does your parameter validation look like? Is there some kind of "best practice" to do this kind of checking?
We can do validation before insert, delete and update operations in stored procedures. Setting validation in a stored procedure on insert, delete and update operation is known as data validation. The CREATE PROC statement is used to create a stored procedure.
As a program, a stored procedure can take parameters. There are three types of parameters: IN, OUT and INOUT.
Just like you have the ability to use parameters with your SQL code you can also setup your stored procedures to accept one or more parameter values.
To pass one or more arguments to a procedure In the calling statement, follow the procedure name with parentheses. Inside the parentheses, put an argument list. Include an argument for each required parameter the procedure defines, and separate the arguments with commas.
I don't think that there is a single "right" way to do this.
My own preference would be similar to your second example, but with a separate validation step for each parameter and more explicit error messages.
As you say, it's a bit cumbersome and ugly, but the intent of the code is obvious to anyone reading it, and it gets the job done.
IF (ISNULL(@fooInt, 0) = 0) BEGIN RAISERROR('Invalid parameter: @fooInt cannot be NULL or zero', 18, 0) RETURN END IF (ISNULL(@fooString, '') = '') BEGIN RAISERROR('Invalid parameter: @fooString cannot be NULL or empty', 18, 0) RETURN END
We normally avoid raiseerror() and return a value that indicates an error, for example a negative number:
if <errorcondition> return -1
Or pass the result in two out parameters:
create procedure dbo.TestProc .... @result int output, @errormessage varchar(256) output as set @result = -99 set @errormessage = null .... if <errorcondition> begin set @result = -1 set @errormessage = 'Condition failed' return @result end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With