Обработка ошибок в пользовательских функциях - PullRequest
9 голосов
/ 06 августа 2009

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

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

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

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

Существует ли какой-либо дружественный для вызывающих способов способ остановки функции при ошибке в SQL Server?

Ответы [ 2 ]

7 голосов
/ 06 августа 2009

Кажется, что пользовательские функции SQL Server немного (и многие другие) ограничены в этом.

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

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

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

Марк

1 голос
/ 12 сентября 2013

Существует возможное решение, приведенное в ответе на дублирующий вопрос здесь , основанное на этой идее:

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, но не для табличных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...