从 SQL Server 2005 中的用户定义函数中“捕获”错误

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 日,等等。如果有任何失败,则不返回任何内容。

【讨论】:

以上是关于从 SQL Server 2005 中的用户定义函数中“捕获”错误的主要内容,如果未能解决你的问题,请参考以下文章

还原SQL Server 2005数据库后,将所有用户链接到登录

SQL Server 2005 中的水平到垂直表转换

如何使用 PHP 将记录从远程 SQL Server 2005 复制到本地 mySQL?

SQL Server 2005 - 用户权限

我可以在没有 [dbo] 的情况下调用 SQL Server 2005 中的函数吗?

sql server 2005 express 中的用户和登录名