Kendra Little explains that SQL Server will cache parameter values for invalid statements:
The first time that dbo.ReviewFlags is executed after the database comes online, it’s with an invalid parameter, like this:
- EXEC dbo.ReviewFlags @Flag = null;
- GO
This is caught by the IF block, hits the RAISERROR, and goes down to the THROW block, and the output is:
- Msg 50000, Level 11, State 1, Procedure ReviewFlags, Line 8 [Batch Start Line 70]
- @Flag must be a value between 1 and 5
But even though SQL Server didn’t execute the SELECT statement, it still compiled it. And it also cached the plan.
Read on to understand the trouble this can cause, as well as a few ways of solving the problem. This is a special case of parameter sniffing problems, but the solutions are the same as in the general case.