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

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

  • 相关阅读:
    委托 你怎么看?
    读懂IL代码就这么简单(二)
    读懂IL代码就这么简单 (一)
    C#操作XML方法集合
    文件夹管理工具(MVC+zTree+layer)(附源码)
    操作文件方法简单总结(File,Directory,StreamReader,StreamWrite )
    让你彻底理解 “==”与 Equals
    处理 EF 并发其实就这么简单
    CentOs7.5安装PostgreSQL11
    SQLAlchemy+Flask-RESTful使用(四)
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/1631235.html
Copyright © 2011-2022 走看看