2012-04-17 14 views
1

t-SQLストアドプロシージャを頻繁に使用するJavaアプリケーションをデバッグしています。時々私はポストのタイトルエラーを取得します。私はエラーが発生する場所を見つけたと思うが、T-SQLは私のスキルの中にない。誰かが私が正しいことを確認して解決策を提案できますか?T-SQL:エラー:8114、重大度:16、状態:5データ型varcharをfloatに変換する際のエラー

SQL Server 2005のスタックトレースが表示され、次のメッセージ:

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

これはfuncCtrlConvertToFloat機能は次のとおりです:

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 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 

次のように希望

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

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

チェックする前に@valueInからグループ化文字を削除してください、これは

関連する問題