1

t-sqlストアドプロシージャを多用するJavaアプリケーションをデバッグしています。投稿のタイトルエラーが発生することがあります。エラーが発生する場所を見つけたと思いますが、T-SQLは私のスキルの1つではありません。誰かが私が正しいことを確認し、解決策を提案できますか?

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)

エラー:8114、重大度:16、状態:5
データ型varcharから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プログラマーではないと言ったので、ヒントをいただければ幸いです。

4

2 に答える 2

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
于 2012-04-17T09:15:35.453 に答える
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

お役に立てれば

于 2012-04-17T09:18:58.830 に答える