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

Откуда: Екатеринбург
Сообщений: 158
Если табличная функция принимает параметры и возвращает 0 строк,
то хочется выдать ругательство "Ай-яй яй! проверьте [параметры]!

хотел сделать так:
в конце записать

if @@ROWCOUNT=0
begin
declare @error varchar(150)
set @error='Не удалось обнаружить соответствие ...'+cast(@Параметр1 as varchar(10))+' и   чего-то там ещё:'+cast(@Параметр2 as varchar(10))+' ну и, наконец, ЛОПАТА...'
raiserror(@error,18,1)
return
end



но не даёт блин. Неправильный синтаксис около ключевого слова "if".
4 дек 12, 12:20    [13574215]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
прочитайте про ограничения в UDF
4 дек 12, 12:21    [13574223]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Денис Б.
Если табличная функция принимает параметры и возвращает 0 строк,
то хочется выдать ругательство "Ай-яй яй! проверьте [параметры]!

Особенно круто это будет выглядеть в запросе

select *
from mytable a
cross aply dbo.myfunc(a.id) b on b.id = a.id

Результат
1, 'AAAA', 18, 2012-01-01
2, 'DDDD', 28, 2012-02-01
3, 'CCC', "Ай-яй яй! проверьте [параметры]!
4 дек 12, 12:25    [13574260]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Glory,
я хочу при обнаружении ошибки остановить выполнение функции, т.к. результат её вызова будет неверный. Ну и заругаться нужно как-то. Исходников клиента нет, поэтому только ругательство из базы спасает.
4 дек 12, 12:29    [13574300]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Денис Б.
я хочу при обнаружении ошибки остановить выполнение функции, т.к. результат её вызова будет неверный.

Результатом вызова функции может быть только объявленный при ее создании тип данных.
Больше функция ничего возвращать не может.
4 дек 12, 12:34    [13574365]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Glory,
Да я уж понял.
Но функции не все идеальны. Обработчик ошибок они могут содержать? Как сообщить вызывающему коду, что результат не валиден?
4 дек 12, 12:41    [13574441]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Денис Б.
Как сообщить вызывающему коду, что результат не валиден?

Через возвращаемый функцией параметер.
4 дек 12, 12:42    [13574455]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Glory,
Тогда получается что сначала нужно вызвать функцию +100500 раз
А только потом искать чего она там неправильного вернула или каждый чих в сторону функции проверять на валидность по возвращённому значению.

Как то это не айс.
4 дек 12, 12:55    [13574571]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Денис Б.
А только потом искать чего она там неправильного вернула

Так не возращайте НЕправильные значения. Кто вас заставляет ?
4 дек 12, 12:57    [13574593]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Glory,
В моём случае неправильное значение-это отсутствие значения, т.е. @@ROWCOUNT=0
4 дек 12, 13:03    [13574646]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Денис Б.
В моём случае неправильное значение-это отсутствие значения, т.е. @@ROWCOUNT=0

И что вас заставляет тогда возвращать в табличной функции какой то результат ?
4 дек 12, 13:07    [13574671]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
не вариант ?
Guest
Денис Б.
Glory,
В моём случае неправильное значение-это отсутствие значения, т.е. @@ROWCOUNT=0


select <всё чё нада>
from <откуда нада>
where <всякая похабень в виде условий>

union all

select 'Не удалось обнаружить соответствие ...'+cast(@Параметр1 as varchar(10))+' и   чего-то там ещё:'+cast(@Параметр2 as varchar(10))+' ну и, наконец, ЛОПАТА...'
where not exists
(select *
from <откуда нада>
where <всякая похабень в виде условий>)
4 дек 12, 13:08    [13574684]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Glory
Денис Б.
В моём случае неправильное значение-это отсутствие значения, т.е. @@ROWCOUNT=0

И что вас заставляет тогда возвращать в табличной функции какой то результат ?

Если функция ничего не возвращает, то запрос с OUTER APPLY будет содержать NULL в некоторых строках. И дальнейшая работа с результатами запроса не валидна.
Тем более нужно указать в каких параметрах зарыта ошибка. А эти параметры легко проверить в функции.
4 дек 12, 13:20    [13574761]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
qwerty112
Guest
Денис Б.
Glory
пропущено...

И что вас заставляет тогда возвращать в табличной функции какой то результат ?

Если функция ничего не возвращает, то запрос с OUTER APPLY будет содержать NULL в некоторых строках. И дальнейшая работа с результатами запроса не валидна.
Тем более нужно указать в каких параметрах зарыта ошибка. А эти параметры легко проверить в функции.

cross apply ?
4 дек 12, 13:21    [13574766]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Денис Б.
Если функция ничего не возвращает, то запрос с OUTER APPLY будет содержать NULL в некоторых строках. И дальнейшая работа с результатами запроса не валидна.

И что же должно быть на месте NULL-а по вашему ? Строка "Ай-яй яй! проверьте [параметры]!" ?
Если для вас все вернувшиеся значения являются валидными, то чем поможет "обработчик ошибок" ?
4 дек 12, 13:30    [13574828]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
qwerty112,
OUTER APPLY
Т.к. в результате нужно показывать всё, т.е. не отбрасывать NULL значения. Иначе вообще не будет заметно, что часть данных не прошла верификацию.
Т.е. с одной стороны нужно показать, что есть несоответствия в данных. Чтобы по тем значениям, которые соединяются с результатом функции, можно было бы понять, где зарыты траблы. С другой стороны, желательно вообще ничего не возвращать, а сразу начать орать об обнаруженных проблемах ещё на уровне обработки функции.
4 дек 12, 13:32    [13574848]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Короче решил всё по другому.
Траблы возникают из-за того, что некоторым важным дядям разрешили менять вручную некоторые параметры. Но обработчик ошибок при этом не воткнули. Поэтому важные дяди и тёти делают разные коллизии. Типа ставят разряд работ которого нет в тарифной сетке или так ставят проценты, что в сумме получается больше ста и т.д. и т.п.
Обработчик ошибок надо ставить в месте их возникновения, а не тащить дальше и рушить логику. Могут конечно уволить за такие подсказки и за попытку "учить что и как им делать", но выхода нет, т.к. дальше эти грабли всяко вылазят.
4 дек 12, 13:45    [13574955]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибки в табличной функции  [new]
invm
Member

Откуда: Москва
Сообщений: 9683
Денис Б.
Поэтому важные дяди и тёти делают разные коллизии. Типа ставят разряд работ которого нет в тарифной сетке или так ставят проценты, что в сумме получается больше ста и т.д. и т.п.
Для этого были придуманы DRI и check constraints, ну и триггеры тоже.
4 дек 12, 14:12    [13575277]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить