Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Способы обработки ошибок в вычислениях  [new]
42ia
Member

Откуда:
Сообщений: 2
Я написал функцию вот с таким интерфейсом
ALTER FUNCTION [dbo].[GetProperty]
(@Product_ID int, @Prop int, @T REAL, @P REAL)
RETURNS REAL

Она из таблицы Property для вещества Product_ID возвращает значение плотности, вязкозти и др. (в зависимости от значения @Proc), при температуре T и давлении Р. Причём возвращает не только табличные значения, но ещё и производит интерполяцию.
Если значения температуры за пределами таблицы, функция вернёт значения свойства на краю таблицы. В таком случае об этом надо сообщить.

Я переделал функцию в процедуру

ALTER PROCEDURE [dbo].[GetProperty] 
	@Product_ID int,
	@Prop int,
	@T real,
	@P real,
	@Value real OUT,
	@Error int OUT


Значение свойства пишется в Value.
В Error пишу 1, если за пределы вышла температура
2 - давление
4 - заданно вещество которого нет в таблице.

Мне не очень нравиться этот метод. Во первых использование выглядит громоздким по сравнению с функцией.
Во вторых мне кажется что должен быть лучший метод.

Подскажите как бы вы выкрутились в подобной ситуации.
24 фев 12, 13:47    [12146709]     Ответить | Цитировать Сообщить модератору
 Re: Способы обработки ошибок в вычислениях  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Классических вариантов два - либо исключение через raiserror, либо через коды возврата. Учитывая, что первый вариант в силу некоторых причин может и не подойти, то ваш вариант ок.
24 фев 12, 13:50    [12146736]     Ответить | Цитировать Сообщить модератору
 Re: Способы обработки ошибок в вычислениях  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Так же можно сделать табличную функцию
ALTER FUNCTION [dbo].[GetProperty]
(@Product_ID int, @Prop int, @T REAL, @P REAL)
RETURNS @t table(Value real, Error tinyint)
или инлайновую
ALTER FUNCTION [dbo].[GetProperty]
(@Product_ID int, @Prop int, @T REAL, @P REAL)
RETURNS table as
return (select Value, Error from ...)
24 фев 12, 14:27    [12147112]     Ответить | Цитировать Сообщить модератору
 Re: Способы обработки ошибок в вычислениях  [new]
42ia
Member

Откуда:
Сообщений: 2
Спасибо большое.

Я конечно пробовал сам сделать исключение через RISEERROR. Но мне этот вариант не очень понравился тем, что это само по себе генерирует ошибку. И если процедура будет вызываться в блоке TRY, то наступят нежелательные последствия. Я же правильно понимаю.

Пока останавлюсь на своём варианте.
24 фев 12, 15:00    [12147343]     Ответить | Цитировать Сообщить модератору
 Re: Способы обработки ошибок в вычислениях  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
42ia
И если процедура будет вызываться в блоке TRY, то наступят нежелательные последствия. Я же правильно понимаю.
Думаю не очень. Тут скорее больше как нравиться, а не где больше проблем. Проблем везде хватает.
Например, мы старпёрный подход с кодами возвратов не используем (точнее используем там где долждно, имеет смысл).

Если "выход за диапазон" это штатная ситуация, то конечно возврат [в inline функции (совет - старайтесь не пользоваться скалярками, они тормозные)]. Если это нарушает целостность данных, то никаких "края" таблицы [валиться на определённом CHECK].
24 фев 12, 16:39    [12148346]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить