首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >T-SQL :错误: 8114,严重性: 16,状态:5,将数据类型varchar转换为浮动

T-SQL :错误: 8114,严重性: 16,状态:5,将数据类型varchar转换为浮动
EN

Stack Overflow用户
提问于 2012-04-17 09:00:21
回答 2查看 8.3K关注 0票数 1

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

Server 2005堆栈跟踪显示以下消息:

代码语言:javascript
运行
复制
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函数的地方:

代码语言:javascript
运行
复制
set @prezzoUnitario2f = [C4].[dbo].[funcCtrlConvertToFloat] (@prezzoUnitario2) --CONVERT(float,replace(@prezzoUnitario2,',','.'))

这是funcCtrlConvertToFloat函数:

代码语言:javascript
运行
复制
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程序员,所以任何提示都会很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-17 09:15:35

我想以下几点应该能解决你的问题:

代码语言:javascript
运行
复制
    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
票数 1
EN

Stack Overflow用户

发布于 2012-04-17 09:18:58

在转换之前,我可以看到您的函数正在检查@valueIn是否为数字。不幸的是,t-sql ISNUMERIC() function returns true for varchar values with group digit simbols (i.e. comma)

例如;

代码语言:javascript
运行
复制
SELECT ISNUMERIC('12,345,678') returns true but fails in convertion

在您的函数中,请删除@valueIn中的分组字符,然后检查如下

代码语言:javascript
运行
复制
--New line to replace grouping char
SELECT @valueIn = REPLACE(@valueIn,',','')

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

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10188167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档