2010-07-15 48 views
1

我有一个TSQL表值函数,它很复杂。我想确保其中一个参数不能为空。然而,当我在参数声明之后指定NOT NULL时,会出现SQL错误。如何防止表值函数参数的空值?

是否可以通过调用SQL来防止将表值函数的参数分配为空?

回答

5

在我看来,最好在函数的开头检查NULL值并使用RAISERROR(不,这不是错字)来引发异常。编辑:不幸的是,这并不能用于UDF的工作,所以你必须去与选项2

您也可以选择指定的选项“返回NULL ON NULL INPUT”当你创建你的函数。如果指定了这个标志,那么如果它的任何输入都是空的,函数将返回NULL ...有点矛盾,但它可能是你想要的。

从MSDN文档CREATE FUNCTION(引用,因为他们没有自己的页面上的锚的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.

希望它可以帮助一些,我不同意,这是不必要的混乱。

+0

谢谢,这是非常详细的。 – Llyle 2010-07-15 02:02:18

+0

你很受欢迎。事实上,在你问及我对它做了一些研究之前,我并没有意识到这些,所以谢谢你。 :) – Faisal 2010-07-15 02:03:15

+1

我打算建议同样的事情(RAISERROR),并决定在我的本地SQL开发框中试用它。您不能在TVF(表值函数)中使用RAISERROR。你会得到这样的错误:'在一个函数中无效使用副作用运算符'RAISERROR''。 – 2010-07-15 02:04:59