添加WHERE后,SQL CONVERT无效

时间:2016-03-07 16:43:35

标签: sql-server tsql numeric varchar

使用: SQL Server 2008 Management Studio,T-SQL

问题描述:我基本上有两个带有AccountNumber列的表格。在一个表中,它存储为NUMERIC,在另一个表中,它存储为VARCHAR(遗憾的是,此数据类型差异无法更改)。

为了保持一致性,为了使它们都进入数值数据类型,我尝试的解决方案仅在LEFT JOIN表中VARCHAR转换为AccountNumber列到NUMERIC

工作正常,查询将会运行。

但是,一旦我向它添加WHERE子句,它就会崩溃并显示如下所示的错误。正如您所看到的,使用WHERE子句,我实际上只是在查询特定的NUMERIC} AccountNumber

AccountNumber出来的LEFT JOIN列为NUMERIC时,为什么会出现此转化错误?

/*
Assumptions:
    A.AFIELD is numeric
    B.BFIELD is varchar

Result:
    Msg 8114, Level 16, State 5, Line 10
    Error converting data type varchar to numeric.
*/

SELECT A.AccountNumber, B.AccountNumber
FROM A
LEFT JOIN 
    (SELECT CONVERT(NUMERIC, B.AccountNumber) AccountNumber
     FROM B
     WHERE ISNUMERIC(B.AccountNumber) = 1) B ON B.AccountNumber = A.AccountNumber
WHERE A.AccountNumber = 1234567890
/*NOTE: I am searching the originally numeric AccountNumber field for a numeric, yet it's erroring out*/

2 个答案:

答案 0 :(得分:1)

您应该执行转换为VARCHAR

select A.AccountNumber, B.AccountNumber
from A
left join
    (
    select AccountNumber
    from B
    where ISNUMERIC(B.AccountNumber)=1
    ) B on B.AccountNumber = CONVERT(VARCHAR(10),A.AccountNumber)
where A.AccountNumber = 1234567890;

答案 1 :(得分:0)

也许我的评论,“它告诉你,B中有一个值(无法转换为数字)”还不够明确。试试这个:

select A.AccountNumber, B.AccountNumber
from A
left join
    (
    select CONVERT(numeric,B.AccountNumber) AccountNumber
    from B
    where ISNUMERIC(B.AccountNumber)=1
    ) B on coalesce(B.AccountNumber,0) = A.AccountNumber
where A.AccountNumber = 1234567890;

这是一个简单的演示:

DECLARE @t1 TABLE
  (
    accountnumber NUMERIC
  );
DECLARE @t2 TABLE
  (
    accountnumber VARCHAR(20)
  );

INSERT  @t1 ( [accountnumber] )
VALUES  ( 1 ),
        ( 2 ),
        ( 3 );

INSERT  @t2 ( [accountnumber] )
VALUES  ( '1' ),
        ( '3' ),
        ( 'NonConvertible' );


SELECT  A.accountnumber, B.accountNumber
FROM    @t1 AS [A]
LEFT JOIN (
            SELECT
                CASE 
                    -- Still not 100% safe because ISNUMERIC isn't
                    WHEN ISNUMERIC(B.accountnumber) = 1
                    THEN CONVERT(NUMERIC, accountnumber) 
                    ELSE CONVERT(NUMERIC, NULL)
                END AS accountNumber
            FROM    @t2 AS [B]
            WHERE   ISNUMERIC(accountNumber) = 1
--          ) B ON B.accountNumber = A.accountnumber
          ) B ON COALESCE(B.accountNumber, 0) = A.accountnumber
WHERE   A.accountnumber = 1;