【问题标题】:How to prevent null values for table-valued function parameters?如何防止表值函数参数出现空值?
【发布时间】:2011-03-16 04:21:06
【问题描述】:

我有一个 TSQL 表值函数,它很复杂。我想确保其中一个参数不能为空。然而,当我在参数声明后指定 NOT NULL 时,我会遇到 SQL 错误。

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

【问题讨论】:

    标签: sql sql-server-2005 tsql user-defined-functions


    【解决方案1】:

    在我看来,最好在函数开头检查 NULL 值并使用 RAISERROR(不,这不是错字)引发异常。 编辑:不幸的是,这不适用于 UDF,因此您必须使用选项 2。

    您还可以在创建函数时指定“RETURNS NULL ON NULL INPUT”。如果指定了这个标志,如果它的任何输入为空,函数将返回 NULL...有点自相矛盾,但它可能是你想要的。

    来自 MSDN CREATE FUNCTION 文档(引用是因为他们的页面上没有锚点,bleh):

    在 NULL 输入时返回 NULL |空输入时调用

    指定标量值函数的 OnNULLCall 属性。如果不 指定,CALLED ON NULL INPUT 是 默认隐含。这意味着 函数体执行,即使 NULL 作为参数传递。

    如果在 CLR 函数中指定了 RETURNS NULL ON NULL INPUT,则它 表示 SQL Server 可以返回 NULL 当它的任何参数 收到的是NULL,实际上没有 调用函数的主体。如果 指定的 CLR 函数的方法 在已经有一个 指示的自定义属性 在 NULL INPUT 上返回 NULL,但 CREATE FUNCTION 语句表示 CALLED ON NULL INPUT,创建 FUNCTION 语句优先。 OnNULLCall 属性不能 为 CLR 表值指定 功能。

    希望它有所帮助,我同意它不必要地令人困惑。

    【讨论】:

    • 谢谢,写的很详细。
    • 不客气。事实上,在你问到我对它进行了一些研究之前,我并不知道其中的大部分内容,所以谢谢你。 :)
    • 我打算提出同样的建议 (RAISERROR),并决定在我本地的 SQL 开发机器上尝试一下。您不能在 TVF(表值函数)中使用 RAISERROR。您将收到错误消息:Invalid use of a side-effecting operator 'RAISERROR' within a function. 请注意。
    • @Samuel:啊哈,感谢您对此进行了测试。那么,也许是“在 NULL INPUT 上返回 NULL”选项?此外,这是一个解决该问题的现有 SO question;他们得出的结论是,您应该返回错误值而不是引发异常:stackoverflow.com/questions/1240541/…
    • @Faisal:我想返回和错误指示值以及对函数的一些评论就足够了:S
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2012-10-01
    • 2015-08-23
    相关资源
    最近更新 更多