日期:2014-05-18  浏览次数:20333 次

数据截取并转化类型

sn num
-- --
A845564 16
B78974645456 8
MM-LN5454554 8
77048464 19
这是序列号打印机打印出的序列号。
一行记录代表一个打印批次,sn列是这个打印批次中最开始的序列号,num列是这个批次中共打印了多少个序列号,每一个序列号是连续的。
请问如何sn中数字部分并转换为int型。
 

------解决方案--------------------
可以使用Convert(data_type,expression[,style])进行数据转换。
select convert(int,sn)
------解决方案--------------------
我还没看懂,是只取数字吗?


非a-z A-Z 0-9以及中文字符之外的字符删除
建立如下函数
create function getnewstr
(@oldstr varchar(100))
returns varchar(100)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^a-z,A-Z,0-9]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end
这样写更新语句
update 表
set 字段 = dbo.getnewstr(字段)
where
字段 like('%[^a-z,A-Z,0-9]%')


------解决方案--------------------
create function dbo.regexReplace
(
@source varchar(5000), --原字符串
@regexp varchar(1000), --正则表达式
@replace varchar(1000), --替换值
@globalReplace bit = 0, --是否是全局替换
@ignoreCase bit = 0 --是否忽略大小写
)
returnS varchar(1000) AS
begin
declare @hr integer
declare @objRegExp integer
declare @result varchar(5000)

exec @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end 
exec @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OADestroy @objRegExp
IF @hr <> 0 begin
return null
end

return @result
end
GO

CREATE TABLE m
(
sn VARCHAR(40),
num INT
)
INSERT INTO m VALUES ('A845564',16) 
INSERT INTO m VALUES ('B78974645456',8)
INSERT INTO m VALUES ('MM-LN5454554',8)
INSERT INTO m VALUES ('77048464',19)

SELECT SN,NUM,COL=CAST(dbo.regexReplace(sn,'[^0-9]','',1,1) AS BIGINT) FROM m

DROP FUNCTION regexReplace
DROP TABLE m


SN NUM COL
---------------------------------------- ----------- -------------------- 
A845564 16 845564
B78974645456 8 78974645456
MM-LN5454554 8 5454554
77048464 19 77048464

(所影响的行数为 4 行)
------解决方案--------------------
如果数字前只是字母可以这样
create table #表(sn varchar(50),num int) 
insert #表 select
'A845564' ,16 insert #表 select
'B78974645456' ,8 insert #表 select
'MM-LN5454554' ,8 insert #表 select
'77048464' ,19 
select stuff(sn,1,PATINDEX('%[0-9]%',sn)-1,'') from #表
------------
845564
78974645456
5454554
77048464
------解决方案--------------------
Create Function F_GetNumeric(@xC Varchar(100))