zoukankan      html  css  js  c++  java
  • 不一般的错误:“从数据类型 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

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

  • 相关阅读:
    CSS实现背景透明,文字不透明(兼容各浏览器)
    JQUERY SCROLL PATH自定义滚动路径
    Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误)
    truffle的调用nodeJs的问题
    Truffle基础篇-Truffle做什么的?怎么安装?
    以太坊智能合约开发笔记
    day02 智能合约
    remix无法安装的解决方案
    基于eth快速发行自己的数字货币
    remix-ide的三种使用方式
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/1631235.html
Copyright © 2011-2022 走看看