更新SQL表时出错 - varchar值的转换溢出了int列

时间:2017-02-15 08:32:28

标签: sql sql-server

我必须更新缺少的所有帐户的交易号。

更新交易号码规则是: -

当两个或多个帐户的邮政编码匹配时,请检查是否有任何电话号码相同或地址与外卡匹配。如果任何一个crieteria得到匹配,那么交易号码就会更新。

DDL: -

DECLARE @MASTER TABLE
 (
 [Account Number] VARCHAR (15),     
 [Trade Number]    VARCHAR (25),
 [ADDRESS 1] VARCHAR (35),
 [BRNAME]    VARCHAR (35),
 [POSTCODE]  VARCHAR (25),
 [Phone Number 1] VARCHAR (8000),     
 [Phone Number 2] VARCHAR (8000),     
 [NEW Phone Number 1]VARCHAR (8000),  
 [NEW Phone Number 2]VARCHAR (8000)
 )

 INSERT @MASTER

 SELECT 'a0001205','',         'UNIT 39',  'SOUTH',    'RM15 4YG',       '07967967404',      '222222222','9988779988',''     UNION ALL  
 SELECT 'a0001205','',         'UNIT 39',  'SOUTH',    'RM15 4YG',     '222222222',      '','',''     UNION ALL        
 SELECT 'a1005338','',         'Unit 3',   'SOUTH',    'RM15 4YG',       '07967967404',   '','',''          UNION ALL  
 SELECT 'a1005338','',         'Unit 3',   'SOUTH',    'RM15 4YG',       '01708865140',   '','',''          UNION ALL
 SELECT 'C5108924','119734','UNIT 39',     'BASILDON', 'RM15 4YG',     '07967967404',   '','',''                      UNION ALL
 SELECT 'C5108924','119734','UNIT 39',     'BASILDON', 'RM15 4YG',     '01708865140',   '','',''                UNION ALL
 SELECT 'C5108965','',         'UNIT 39',  'BASILDON', 'RM15 4YG',     '865140'      ,    '','',''                UNION ALL
 SELECT 'C5108965','',         'UNIT 39',  'BASILDON', 'RM15 4YG',     '865140'      ,      '','',''                UNION ALL
 SELECT 'I0010050','',         'UNIT 39',  'WEST',     'RM15 4YG',        '01708865140',      '01708865140','','55555555'           UNION ALL  
 SELECT 'I0010050','',         'UNIT 39',  'WEST',     'RM15 4YG',        '',   '01708865140','',''           UNION ALL
 SELECT 'I7000438','',         'Unit 3',   'EAST',     'RM15 4YG',        '',      '01708865140','',''                 UNION ALL
 SELECT 'I7000438','',         'Unit 3',   'EAST',     'RM15 4YG',        '55555555',      '01708865140','',''

Code:

;with cte as (
   select o.*, x.FoundTradeNumber
     from @MASTER as o
     cross apply (
       select top 1 FoundTradeNumber = i.[Trade Number]
         from @MASTER  as i
         where REPLACE(i.[POSTCODE], ' ', '')=REPLACE(o.[POSTCODE], ' ', '')
           and nullif(i.[Trade Number],'') is not null
           and (
              nullif(i.[Phone Number 1],0) in (o.[Phone Number 1], o.[Phone Number 2],o.[NEW Phone Number 1], o.[NEW Phone Number 2])
           or nullif(i.[Phone Number 2],0) in (o.[Phone Number 1], o.[Phone Number 2],o.[NEW Phone Number 1], o.[NEW Phone Number 2])
            or nullif(i.[NEW Phone Number 1],0) in (o.[Phone Number 1], o.[Phone Number 2],o.[NEW Phone Number 1], o.[NEW Phone Number 2])
             or nullif(i.[NEW Phone Number 2],0) in (o.[Phone Number 1], o.[Phone Number 2],o.[NEW Phone Number 1], o.[NEW Phone Number 2])
           or i.[ADDRESS 1] LIKE o.[ADDRESS 1]+'%'         
               )
         ) as x
     where nullif(o.[Trade Number],'') is null
      and (o.[Phone Number 1] > 0 or o.[Phone Number 2] > 0 OR o.[NEW Phone Number 1] >0 OR o.[NEW Phone Number 2]>0 )
 )
 --select * from cte
 update cte set [Trade Number] = FoundTradeNumber 

错误: -

Msg 248, Level 16, State 1, Line 32
The conversion of the varchar value '07967967404' overflowed an int column.

我无权更改列的数据类型。

还有其他办法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

这应该有效,你只需要在单引号中加0(' 0')

nullif(i.[Phone Number 1],'0')
o.[Phone Number 1] > '0'

结果: enter image description here