Обработка ошибок в пользовательских функциях

Я хочу написать пользовательскую функцию, отличную от CLR, в SQL Server 2005. Эта функция принимает входную строку и возвращает выходную строку. Если входная строка недействительна, я хочу указать вызывающему абоненту на ошибку.

Моей первой мыслью было использовать RAISERROR для создания исключения. Однако SQL Server не допускает этого внутри UDF (хотя вы можете создавать исключения в UDF на основе CLR, см. Рисунок).

Мое последнее средство - вернуть NULL (или какое-либо другое значение индикатора ошибки) из функции, если входное значение ошибочно. Однако мне этот вариант не нравится, так как он:

  1. Не предоставляет звонящему никакой полезной информации
  2. Не позволяет мне возвращать NULL в ответ на действительный ввод (поскольку он используется как код ошибки).

Есть ли удобный для вызывающего абонента способ остановить функцию при ошибке в SQL Server?


person Craig Walker    schedule 06.08.2009    source источник


Ответы (2)


Кажется, что UDF SQL Server немного ограничены в этом (и во многих других) способах.

Вы действительно не можете много с этим поделать - это (пока) так оно и есть. Либо вы можете определить свой UDF, чтобы вы могли сигнализировать об ошибке с помощью его возвращаемого значения (например, возвращая NULL в случае ошибки), либо тогда вам почти придется прибегнуть к написанию хранимой процедуры вместо этого, которая может иметь намного больше обработки ошибок и позволяет RAISERROR и так далее.

Таким образом, либо спроектируйте свой UDF так, чтобы он не требовал конкретной сигнализации об условиях ошибки, либо вам придется перестроить свой подход для использования хранимых процедур (которые могут иметь несколько параметров OUTPUT и, таким образом, также могут возвращать код ошибки вместе с вашими полезными данными, если вы нужно) или управляемый код CLR для ваших UDF.

Извините, у меня нет лучшей идеи - пока, боюсь, это ваши варианты - выбирайте.

Марк

person marc_s    schedule 06.08.2009
comment
Я ожидал этого, но думал, что спрошу. Спасибо. - person Craig Walker; 06.08.2009
comment
Проблема со sprocs заключается в том, что вы не можете вызывать их встроенным способом, как с помощью функций. - person Mike K; 08.01.2013
comment
Я согласен с @MikeK. Вся причина, по которой я использую UDF, а не полную stored_procedure, предназначена для встроенного использования. Изменился ли ответ на этот вопрос в новых версиях SQL Server? (например, 2016) - person ColinMac; 19.09.2017
comment
Я просто думаю, что это фантастика, что этот вопрос все еще помогает людям, 8 лет спустя. :) О, и обновите свой SQL Server, сейчас у нас есть THROW и CATCH. - person Mike K; 19.09.2017

Возможное решение, данное в ответе на повторяющийся вопрос, здесь, основано на этой идее:

return cast('Error message here.' as int);

Что выдает что-то вроде этого:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'Error message here.' to data type int.

Он работает нормально для UDF со скалярным значением, но не для UDF с табличным значением.

person Jonathan Sayce    schedule 12.09.2013
comment
Я полагаю, можно было бы вернуть текст ошибки в ожидаемой форме таблицы, да? - person ColinMac; 19.09.2017