Как обойти ограничение UDF для операторов с побочными эффектами? - PullRequest
1 голос
/ 04 октября 2009

Microsoft Books Online (BOL) на Использование данных изменения объясняет вводящие в заблуждение сообщения об ошибках для cdc.fn_cdc_get_all_changes_* & cdc.fn_cdc_get_net_changes_* при пропуске недопустимого номера LSN (порядкового номера журнала) за пределами допустимого диапазона им.


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. Тем не менее, ценность возвращения распознаваемая, если неточная, ошибка была предпочтительнее простого возвращения пустой результат. Пустой набор результатов не будет отличаться от действительный запрос не возвращает изменений.

Вот демонстрация того, что означало примечание RAISERROR alt text

Бывают ситуации, когда я хотел бы выдать ошибку, и вы не можете использовать TRY..CATCH в UDF, так как он также имеет побочный эффект, такой как RAISERROR.

Теперь вопрос состоит в том, как вы обойдете эту проблему?
Я уверен, что вы сталкивались с этим ограничением раньше.
Какую альтернативу вы бы предложили?


[ОБНОВЛЕНИЕ] Предположим, что вы вынуждены использовать UDF.

1 Ответ

2 голосов
/ 04 октября 2009

В случае, если ваша функция возвращает BIT, я верну NULL обратно к вызывающему коду, и в какой-то момент после использования функции проверьте NULL, и затем выдам ошибку.

...