【问题标题】:"Catching" Errors from within a user defined function in SQL Server 2005从 SQL Server 2005 中的用户定义函数中“捕获”错误
【发布时间】:2011-03-18 14:59:26
【问题描述】:

我有一个将数字作为输入并将其转换为日期的函数。这个数字不是日期数字的任何标准形式,所以我必须手动将数字的一部分细分为不同的日期部分,将日期部分转换为 varchar 字符串,然后将字符串连接并转换为新的 datetime 对象。

我的问题是如何捕获转换失败并从我的函数返回 null 或低范围值?我希望我的函数“被动”失败,返回默认值,而不是向我的存储过程返回失败代码。 TRY/CATCH 语句显然在函数中不起作用(除非有某种我不知道的定义标志)并且尝试标准的 '@@Error 0' 方法也不起作用。

【问题讨论】:

    标签: sql-server error-handling user-defined-functions


    【解决方案1】:

    顺便说一句,这听起来像是一个标量 UDF。正如 Alex 的博客所指出的,这是一场性能灾难。 http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/05/23/reuse-your-code-with-cross-apply.aspx

    【讨论】:

    • 有趣的链接。我不知道 APPLY 子句。
    【解决方案2】:
    SELECT CASE WHEN ISDATE(@yourParameter) = 1
       THEN CAST(@yourParameter AS DATETIME) 
       ELSE YourDefaultValue 
    END
    

    【讨论】:

    • RLH 不是说这个数字不是任何标准的日期形式吗?我认为 ISDATE 在这种情况下不会起作用。
    【解决方案3】:

    由于格式是非标准的,在我看来,您必须在投射之前自己进行所有验证。确保各个部分是数字,检查月份是否在 1 到 12 之间,确保不是 2 月 30 日,等等。如果有任何失败,则不返回任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2010-09-23
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多