如何绕过副作用运算符的UDF限制?

时间:2009-10-03 21:56:18

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

Using Change Data上的Microsoft联机丛书(BOL)解释了cdc.fn_cdc_get_all_changes_*&的错误消息。 cdc.fn_cdc_get_net_changes_*当一个无效的超出范围的LSN(日志序列号)传递给它们时。{/ p>


Msg 313, Level 16, State 3, Line 1

An insufficient number of arguments were supplied for the procedure or function `cdc.fn_cdc_get_all_changes_` ...

Msg 313, Level 16, State 3, Line 1

An insufficient number of arguments were supplied for the procedure or function `cdc.fn_cdc_get_net_changes_` ...

他们对这个误导性错误消息的解释如下:

  

注意:   人们认识到了这一点   Msg 313的消息具有误导性   没有传达实际的原因   失败。这种尴尬的用法源于此   从无法提出一个   TVF中的显式错误。   尽管如此,返回的价值仍然存在   可识别的,如果不准确,则错误   被认为比简单回归更可取   一个空的结果。空结果集   不会与a区别开来   有效查询不返回任何更改。

以下是该笔记的含义RAISERROR alt text

有时候我想抛出一个错误,你不能在UDF中使用TRY..CATCH,因为它也有像RAISERROR那样的副作用。  

现在问题是,如何解决这个问题?
我相信你以前遇到过这个限制。
你会建议什么选择?


[更新] 我们假设您被迫使用UDF

1 个答案:

答案 0 :(得分:2)

如果你的函数返回BIT,我会将NULL返回给调用代码,并且在使用函数检查NULL之后的某个时刻,然后抛出一个错误。