SQL SERVER 全角和半角的解决方法

今天在开发项目当中遇到了一个非常郁闷的问题,导致我的更新总是屡屡失败,数字全角半角的问题

update corptax

set corptax.mandep = c.SALECOMPANY
from corptax t,collection c
where t.INVOICECODE = c.invoicecode and cast(t.invoiceno as int(8)) between c.BEGINCODE  and c.ENDCODE

corptax 表中的 invoiceno 是一个varchar(50)的,其实实际上这个字段保存的是(0-9)8位数字,用别人的表只能自己解决了,invoiceno在数据库中的错误记录如下:

00412051
02155331

等等……

解决方法,自定一个用户函数:去替换掉里面的全角字符

CREATE FUNCTION shasha  (@fphm varchar(50))
RETURNS varchar(8)
AS
BEGIN
   SET @fphm = replace(@fphm,' ','');
   SET @fphm = replace(@fphm,'0','0');
   SET @fphm = replace(@fphm,'1','1');
   SET @fphm = replace(@fphm,'2','2');
   SET @fphm = replace(@fphm,'3','3');
   SET @fphm = replace(@fphm,'4','4');
   SET @fphm = replace(@fphm,'5','5');
   SET @fphm = replace(@fphm,'6','6');
   SET @fphm = replace(@fphm,'7','7');
   SET @fphm = replace(@fphm,'8','8');
   SET @fphm = replace(@fphm,'9','9');
   RETURN(@fphm)
END

之后用sql 语句更新就可以了

update corptax set invoiceno = dbo.shasha(invoiceno) where ASCII(SUBSTRING(invoiceno,1,1))>57

where 后面条件的意思是如果取到的第一个数字的ascii不在(0-9)之内,0的ascii码为48, 9的ascii为57.全角的ascii码大于半角的ascii码,这样所有全角的记录就被更新成半角了。

希望我们每个人都能用心去解决自己遇到的问题。

 

你可能感兴趣的:(sqlserver,数据库)