2012-04-17 5 views
1

Я отлаживаю приложение Java, которое в значительной степени использует хранимую процедуру t-sql. Иногда я получаю ошибку заголовка сообщения. Я думаю, что нашел место, где произошла ошибка, но T-SQL не входит в число моих навыков. Может ли кто-нибудь подтвердить, что я прав, и предложить решение, пожалуйста?T-SQL: Ошибка: 8114, Уровень важности: 16, Состояние: 5 Ошибка преобразования типа данных varchar в float

SQL Server 2005 трассировки стека показать следующие сообщения:

set @prezzoUnitario2f = funcCtrlConvertToFloat] (@prezzoUnitario2) 
IF @prezzoUnitario2f IS NULL OR cast(@prezzoUnitario2f as varchar) = '' OR @prezzoUnitario2f < 0 
SET @defaultValue = NULL 
IF ((select ISNUMERIC(@valueIn)) = 1) 

Error: 8114, Severity: 16, State: 5
Error converting data type varchar to float.

Это где хранимая процедура вызовов возможны funcCtrlConvertToFloat функции:

set @prezzoUnitario2f = [C4].[dbo].[funcCtrlConvertToFloat] (@prezzoUnitario2) --CONVERT(float,replace(@prezzoUnitario2,',','.')) 

Это функция funcCtrlConvertToFloat:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[funcCtrlConvertToFloat] 
(
@valueIn varchar(100) 
) 
RETURNS float 
AS 
BEGIN 
DECLARE @defaultValue float 
DECLARE @returnValue float 
SET @defaultValue = NULL 
--SET @valueIn = ISNULL(@valueIn, 0) 

IF ((select ISNUMERIC(@valueIn)) = 1) 
BEGIN 
SET @returnValue = CONVERT(float,replace(@valueIn ,',','.')) 
END 
ELSE 
BEGIN 
SET @returnValue = @defaultValue 
END 

RETURN @returnValue 
END 

Как я уже сказал, я не T-SQL программист, поэтому любой намек был бы оценен

+1

Вы можете проверить, какой ** вход ** отправляются к тому, что функция ?? Кажется, что он делает некоторые проверки здравомыслия, но по какой-то причине они не работают все время - зная, какие значения передаются в функцию, было бы полезно –

ответ

1

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

ALTER FUNCTION [dbo].[funcCtrlConvertToFloat] (
      @valueIn varchar(100) 
    ) 
    RETURNS float 
    AS BEGIN 

    -- declare result variable and set a default value 
    DECLARE @result float; 
    SET @result = NULL; 

    -- adjust @valueIn decimal separator 
    SET @valueIn = REPLACE(@valueIn, ',', '.'); 

    -- if @valueIn is numeric set its value to the @result 
    IF (ISNUMERIC(@valueIn) = 1) 
    BEGIN 
      SET @result = CONVERT(FLOAT, @valueIn); 
    END 

    RETURN @result; 
    END 
0

Я могу видеть ваши функция проверяя, является ли значение @valueIn числовым до преобразования. К сожалению, t-sql ISNUMERIC() function returns true for varchar values with group digit simbols (i.e. comma)

Например,

SELECT ISNUMERIC('12,345,678') returns true but fails in convertion 

В функции, пожалуйста, удалить группировку полукокса из @valueIn перед проверкой следующего

--New line to replace grouping char 
SELECT @valueIn = REPLACE(@valueIn,',','') 

IF ((SELECT ISNUMERIC(@valueIn)) = 1) 
---Rest of the function 

Надеется, что это помогает

Смежные вопросы

 Смежные вопросы