2017-02-15 114 views
0

我必须更新所有缺失的帐户的交易号。更新SQL表时出错 - varchar值的转换溢出了int列

更新商标号规则是: -

时邮政编码为两个或两个以上账户匹配,那么检查所有的电话号码是否相同或地址匹配外卡。如果任何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. 

我没有被授权改变列的数据类型。

有没有其他方法可以做到这一点。

感谢

+3

“不幸的是我的Varchar意识到保存电话号码不良好的做法“ - 谁告诉你的?也很确定一个电话号码永远不会超过24位! –

+0

@MitchWheat:是的你说得对。我的第二项任务是使用SSIS清除所有不良数据 –

+0

是否没有办法做到这一点。请建议 –

回答

1

这应该工作,你只需要0单引号( '0')内

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

结果: enter image description here

相关问题