现在要规范身份证号18位,超过18位的截断,字段名certificateNo (varchar(20))
,语句改如何写?
NAME certificateNo001 440722198606011151?
,语句改如何写?
NAME certificateNo001 440722198606011151?
解决方案 »
- 请问如何显示数据库中某一值中的某一部分
- 请教一个复杂查询问题
- 如何将C# 的DATASET 直接写入(Insert)Oracle?
- 各位高手请进,给出您的建议。
- 100分求(省市县学校(大学和高中))的联动数据库(类似海内网,校内网的联动)!
- [求助]有关循环插入数据的问题!!-----(初学者)
- 再次提问。如何返回表的主键列的列名。不要SP_PKEYS. (在线等待)
- 寻求关于大数据量,多个表关联查询超时问题的解决办法
- 面试过的一高难度题,高分求解!!!
- 为何不能连接另一台机子上的SQLserver2000服务器?
- 含有汉字和数字,但是要根据数字进行选择的条件怎么写?
- 请教,去除重复记录的问题!
returns varchar(18)
as
begin
declare @i int,@no varchar(18)
set @i=1
set @no=''
while @i<=len(@str)
begin
set @no=@no+case when isnumeric(substring(@str,@i,1))=1 then substring(@str,@i,1) else '' end
set @i=@i+1
end
return @no
end
go
select dbo.f_filter('440722198606011151?'),dbo.f_filter('a?440722weir2198606011151?')
(NAME varchar(5), certificateNo varchar(25))
insert into # select '001', '440722198606011151?'
insert into # select '002', '#&^440722198606011151?'
insert into # select '003', '#%440722198606011151?'
select name,substring(certificateNo,patindex('%[0-9]%',certificateNo),18)[certificateNo] from #
name certificateNo
----- -------------------------
001 440722198606011151
002 440722198606011151
003 440722198606011151
樓上的正確
create table #
(NAME varchar(5), certificateNo varchar(25))
insert into # select '001', '44072219860601115x?'
select name,substring(certificateNo,patindex('%[0-9]%',certificateNo),18)[certificateNo] from #
这些日子很有激情阿!看来是快生啦!
go
create function f_filter(@str varchar(100))
returns varchar(18)
as
begin
declare @i int,@no varchar(18)
set @i=1
set @no=''
while @i<=len(@str)
begin
set @no=@no+case when isnumeric(substring(@str,@i,1))=1 then substring(@str,@i,1) else '' end
set @i=@i+1
end
return @no
end
go
update bankaccount set certificateNo=dbo.f_filter(certificateNo)
go
if exists(select name from sysobjects where name='f_filter') drop function f_filter
if exists(select name from sysobjects where name='f_filter') drop function f_filter
go
create function f_filter(@str varchar(100))
returns varchar(18)
as
begin
declare @i int,@no varchar(18)
set @i=1
set @no=''
while @i<=len(@str)
begin
set @no=@no+case when isnumeric(substring(@str,@i,1))=1 or substring(@str,@i,1)='x' or substring(@str,@i,1)='X' then substring(@str,@i,1) else '' end
set @i=@i+1
end
return @no
end
go
update bankaccount set certificateNo=dbo.f_filter(certificateNo)
go
if exists(select name from sysobjects where name='f_filter') drop function f_filter
DECLARE @temp varchar(18) SET @temp =''
DECLARE @SourceSql VARCHAR(100)
DECLARE @str VARCHAR(10)
set @SourceSql=rtrim(ltrim('44072219860601115x?'))
--set @i=charindex(@StrSeprate,@SourceSql)
SET @i = 0
while @i < LEN(@SourceSql)
begin
set @str = rtrim(ltrim(SUBSTRING(@SourceSql,@i+1,1)))
--检测是否为数字
IF ISNUMERIC(@str) = 1 OR @str = 'x' BEGIN --print @str
SET @temp = @temp + @str
--print @temp
--set @temp = CONVERT(VARCHAR(18),@temp) + CONVERT(VARCHAR(1),@str) END
set @i=@i+1
endPRINT @temp
----------------------------------------------------------
如果看懂了~~就别问看不懂的问题
如果看不懂~~就动手测~~~别浪费时间
对其的过滤不要放在数据库中做,在写入数据库的时候就应该验证