Как поймать сообщение об ошибке «Ошибка преобразования типа данных varchar в десятичную» - PullRequest
2 голосов
/ 02 февраля 2011

У меня есть хранимая процедура, которая выполняет обновление с блоком try catch. Столбец (discountPercentage) задается как десятичный тип данных. Я хочу, чтобы хранимая процедура ловила, если пользователь вставляет discountPercentage как что-либо кроме десятичного числа, например, если он пытается вставить 45% Я использую функцию ERROR_MESSAGE и по какой-то причине она не перехватывает сообщение об ошибке. Я все еще получаю сообщение об ошибке, в котором говорится: «Ошибка преобразования типа данных varchar в десятичную». Вот мой код:

alter procedure procUpdateFoodTitleConditionDiscount
(
    @foodTitleId int,
    @conditionId int,
    @discountPercentage decimal(4,2),
    @errorMessage varchar(100) output
)
as 
begin
set @errorMessage = 'Discount updated'  

begin try
    update Discount
    set discountPercentage = @discountPercentage
    where foodTitleId = @foodTitleId and conditionId = @conditionId

    if (@@ROWCOUNT = 0)
    begin
        set @errorMessage = 'Update not successful.'
    end
end try

begin catch
    if (ERROR_MESSAGE () like '%converting%')
    begin
        set @errorMessage = 'Please Insert Discount Percentage as a Decimal (ex 0.45)'
    end
end catch

end;

declare @errorMessageValue varchar (100)
execute procUpdateFoodTitleConditionDiscount
    @foodTitleId = '104', 
    @conditionId = '4',
    @discountPercentage = '45%', 
    @errorMessage = @errorMessageValue output
print @errorMessageValue

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Если вы пытаетесь что-то подобное

Exec procUpdateFoodTitleConditionDiscount 1,1,'45%'

Подпись вашей процедуры препятствует выполнению любого из процедур.

Например, если вы добавили

begin
PRINT 'foo'

set @errorMessage = 'Discount updated'  

'foo' никогда не будет напечатан.

Если вы хотите описанное вами поведение, вам нужно изменить @discountPercentage decimal(4,2), на @discountPercentage varchar(10)

1 голос
/ 02 февраля 2011

Вы не можете перехватить эту ошибку в процедуре: это происходит до запуска вашего кода.

Это необходимо очистить в коде клиента.Ведь 45% это 0,45.SQL Server просто не хорош в этом

Вы могли бы изменить параметр на varchar и сделать некоторые манипуляции, но это просто глупо

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