views:

31

answers:

1

I have a TSQL Table-Valued Function and it is complex. I want to ensure that one of the parameters cannot be null. Yet, when I specify NOT NULL after my parameter declaration I am presented with SQL errors.

Is it possible to prevent a parameter of a Table-Valued Function to be assigned null by the calling SQL?

+4  A: 

In my opinion, it'd be better to check for NULL values at the beginning of your function and use RAISERROR (no, that's not a typo) to raise an exception. EDIT: Unfortunately, this doesn't work for UDFs, so you'll have to go with option 2.

You also have the option of specifying "RETURNS NULL ON NULL INPUT" when you create your function. If this flag is specified, the function will return NULL if any of its inputs are null...kind of paradoxical, but it may be what you want.

From the MSDN CREATE FUNCTION documentation (quoted because they don't have an anchor on their page, bleh):

RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT

Specifies the OnNULLCall attribute of a scalar-valued function. If not specified, CALLED ON NULL INPUT is implied by default. This means that the function body executes even if NULL is passed as an argument.

If RETURNS NULL ON NULL INPUT is specified in a CLR function, it indicates that SQL Server can return NULL when any of the arguments it receives is NULL, without actually invoking the body of the function. If the method of a CLR function specified in already has a custom attribute that indicates RETURNS NULL ON NULL INPUT, but the CREATE FUNCTION statement indicates CALLED ON NULL INPUT, the CREATE FUNCTION statement takes precedence. The OnNULLCall attribute cannot be specified for CLR table-valued functions.

Hope it helps somewhat, and I do agree that it's needlessly confusing.

Faisal
Thanks, that's quite detailed.
vanslly
You're quite welcome. In fact, I wasn't aware of most of that until you asked and I did some research into it, so thank you. :)
Faisal
I was going to suggest the same thing (RAISERROR), and decided to try it out on my local SQL dev box. You can't use RAISERROR in a TVF (table valued function). You'll get the error: `Invalid use of a side-effecting operator 'RAISERROR' within a function.` Just a heads up.
Samuel Meacham
@Samual: Drat, you are correct. And the conundrum continues...
vanslly
@Samuel: Aha, thank you for testing that out. Perhaps the "RETURNS NULL ON NULL INPUT" option, then? Also, here's an existing SO question that addresses the problem; they conclude that you should return an error value rather than raise an exception: http://stackoverflow.com/questions/1240541/error-handling-in-user-defined-functions
Faisal
@Faisal: I suppose returning and error indicating value and some commenting of the function would then have to suffice :S
vanslly