从 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数据库后,将所有用户链接到登录
如何使用 PHP 将记录从远程 SQL Server 2005 复制到本地 mySQL?