1

我正在调试一个大量使用 t-sql 存储过程的 java 应用程序。有时我会收到帖子的标题错误。我想我已经找到了错误发生的地方,但是 T-SQL 不在我的技能范围之内。有人可以确认我是对的并提出解决方案吗?

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 转换为浮点数时出错。

这是存储过程调用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 回答