• 不一般的错误:“从数据类型 nvarchar 转换为 numeric 时出错”


    今天在工作中遇到一个错误,“从数据类型 nvarchar 转换为 numeric 时出错”看上去很简单,但是我确搞了好久还是不清楚为什么出错。请大侠们帮我看看吧。

    数据表如下:

    代码
    //数据类型, 有两种‘Number’和‘Picker’
    CREATE TABLE DataType
    (
        ID        
    INT IDENTITY,
        Code    
    NVARCHAR(20NOT NULL
    )

    INSERT INTO DataType VALUES ('Number')
    INSERT INTO DataType VALUES ('Picker')

    //数据类型为Picker的值
    CREATE TABLE PickerValue
    (
        ID        
    INT IDENTITY,
        
    [Value] NVARCHAR(20NOT NULL
    )

    INSERT INTO PickerValue VALUES ('AAA')
    INSERT INTO PickerValue VALUES ('BBB')

    //数据表1
    CREATE TABLE DataValue
    (
        ID        
    INT IDENTITY,
        ParentID    
    INT NOT NULL,
        TypeID        
    INT NOT NULL,
        
    [Value]        DECIMAL(5,1),
        
    [PickerID]    INT
    )

    INSERT INTO DataValue VALUES (1,1,'123.0',NULL)
    INSERT INTO DataValue VALUES (1,2,NULL,1)

    //数据表2
    CREATE TABLE DataValue2
    (
        ID        
    INT IDENTITY,
        ParentID    
    INT NOT NULL,
        TypeID        
    INT NOT NULL,
        
    [Value]        NVARCHAR(20NOT NULL
    )

    INSERT INTO DataValue2 VALUES (1,1,'123.0')
    INSERT INTO DataValue2 VALUES (1,2,'AAA')

    我说说我的意图:

    DataValue2中的Value是NVARCHAR类型,他存放了DataValue中的Value何PickerID。现在我需要将DataValue(DV)和DataValue2(DV2)进行关联查询出数据类型相等并且Value相等的数据时,返回IsActive为1,否则为0.

    最初我写的查询语句

    代码
    SELECT DISTINCT
        DV.ID,
        DV.TypeID,    
        IsActive 
    = CASE WHEN 
                    (DT.Code 
    = 'Number' AND CAST(DV2.Value AS DECIMAL(5,1)) = DV.Value) OR 
                    (DT.Code 
    = 'Picker' AND DV2.Value = PV.Value) THEN
                    
    1
                
    ELSE
                    
    0
                
    END                 
    FROM DataValue DV
    INNER JOIN DataValue2 DV2 ON DV.ParentID = DV2.ParentID
    INNER JOIN DataType DT ON DV.TypeID = DT.ID  AND DV2.TypeID = DT.ID
    LEFT JOIN PickerValue PV ON PV.ID = DV.PickerID

    本以为大功告成,谁知执行的时候出现了错误"从数据类型 nvarchar 转换为 numeric 时出错".

    开始我认为SQL中会将DT.Code = 'Number' CAST(DV2.Value AS DECIMAL(5,1)) = DV.Value)都执行,后来我将(DT.Code = 'Number' AND CAST(DV2.Value AS DECIMAL(5,1)) = DV.Value)改为(1 = 0 AND CAST(DV2.Value AS DECIMAL(5,1)) = DV.Value),就不会出错,也就是说,当程序判读到1=0是为false时,就不会在执行后面的语句。 这就让我更加晕了。

     

    没有办法,最后只能这样写了。

     

    代码
    SELECT DISTINCT
        DV.ID,
        DV.TypeID,    
        IsActive 
    = 
                    
    CASE WHEN DT.Code = 'Number' THEN                    
                        
    CASE WHEN CAST(DV.Value AS DECIMAL(5,1)) = DV2.Value THEN
                            
    1
                        
    ELSE 
                            
    0
                        
    END
                    
    ELSE 
                        
    CASE WHEN DT.Code = 'Picker' THEN
                        
    CASE WHEN PV.Value = DV2.Value THEN
                            
    '1'
                        
    ELSE
                            
    '0'
                        
    END
                    
    END 
                    
    END
    FROM DataValue DV
    INNER JOIN DataValue2 DV2 ON DV.ParentID = DV2.ParentID
    INNER JOIN DataType DT ON DV.TypeID = DT.ID AND DV2.TypeID = DT.ID
    LEFT JOIN PickerValue PV ON PV.ID = DV.PickerID

    虽然执行过去了,但是真的不知道其中的原因,希望高手能帮我点点经。

  • 相关阅读:
    (转)创建DB2实例时出错,请大家帮忙解决
    lscons 命令,设置当前控制台设备的名称写至标准输出
    (转)AIX下修改用户最大进程数
    (转)AIX 5.3 安装中文语言包
    (转)AIX修改系统时区的3种方法和AIX 时间问题(夏令时)
    (转)企业级NFS网络文件共享服务
    一天一个mysql函数(二) FIND_IN_SET()
    sql语句备忘
    一天一个mysql函数(一) cast && convert
    c语言海量数据处理
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/1631235.html
Copyright © 2020-2023  润新知