Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 添加WHERE时SQL CONVERT不工作_Sql Server_Tsql_Numeric_Varchar - Fatal编程技术网

Sql server 添加WHERE时SQL CONVERT不工作

Sql server 添加WHERE时SQL CONVERT不工作,sql-server,tsql,numeric,varchar,Sql Server,Tsql,Numeric,Varchar,使用:SQL Server 2008管理工作室,T-SQL 问题描述:我基本上有两个带有AccountNumber列的表。在一个表中,它存储为NUMERIC,在另一个表中,它存储为VARCHAR(不幸的是,此数据类型差异无法更改) 因此,为了保持一致性,为了将它们都转换为数值数据类型,我尝试的解决方案是将VARCHAR表中的左连接,并将AccountNumber列转换为数值 这很好,查询将运行 但是,只要我向它添加WHERE子句,它就会崩溃,错误如下所示。如您所见,使用WHERE子句,我基本上只

使用:SQL Server 2008管理工作室,T-SQL

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

因此,为了保持一致性,为了将它们都转换为数值数据类型,我尝试的解决方案是将
VARCHAR
表中的
左连接
,并将
AccountNumber
列转换为
数值

这很好,查询将运行

但是,只要我向它添加
WHERE
子句,它就会崩溃,错误如下所示。如您所见,使用
WHERE
子句,我基本上只是对特定(
NUMERIC
AccountNumber
进行查询搜索

左联接中的
AccountNumber
列为
数值时,为什么会出现此转换错误问题

/*
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*/

您应该执行到
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;

也许我的评论“它告诉你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;

拉马克,谢谢你的回复。出于其他原因,最好将B转换为数字。基本上,这个查询将被抛出到Excel数据连接中,最终用户将把数字帐号列表放到Excel列中。VBA脚本会将它们全部循环在一起,并将它们放入查询的WHERE部分并返回结果。@Chase我不认为有问题,您可以在
WHERE
Condition中将这些值用作数字抱歉-更详细地说,一些最终用户将使用数字,而另一些用户将使用VARCHAR(例如,“01234567890”)。这有点令人恼火,但这取决于他们从哪个记录系统获取帐号。因此,转换为数字将确保正确的结果,而转换为varchar可能会返回正确的结果。我想更根本的原因是我的查询出错?@Chase Lamak建议的转换仅用于我n
WHERE
ON
子句。输出(
SELECT
列表)包括未转换的两列。因此,您可以使用任意内容进行导出。它告诉您B中有一个值无法转换为数字。
case when is numeric()然后convert(numeric)结束
我真的想问下一个投票人,为什么?只是为了满足?我不是下一个投票人,但是什么让你认为这样可以防止错误发生?很简单,错误指向它:)这就是MS SQL server的工作方式。我觉得当人们不理解某些事情时,简单地否决投票是不礼貌的。我知道错误的意思,我只是说这并不能真正解决所有情况。例如,将
'1e1'
添加到
@t2
表中,然后查看是什么happens@Lamak是的,1e1将是一个问题,对于2008年,我想不出一个简单的解决方案。在2012年,您可以简单地使用带有TRY\u CONVERT(numeric,accountnumber)的原始查询