我正在调试一个大量使用t存储过程的java应用程序。有时我会得到帖子的标题错误。我想我已经找到了发生错误的地方,但是T并不是我的技能之一。有人能确认我是对的并提出解决方案吗?
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
正如我已经告诉过的,我不是一个told程序员,所以任何提示都会很感激。
发布于 2012-04-17 09:15:35
我想以下几点应该能解决你的问题:
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-17 09:18:58
在转换之前,我可以看到您的函数正在检查@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
希望这能有所帮助
https://stackoverflow.com/questions/10188167
复制相似问题