现在要规范身份证号18位,超过18位的截断,字段名certificateNo (varchar(20))
,语句改如何写?
NAME   certificateNo001     440722198606011151?

解决方案 »

  1.   

    select NAME,left(certificateNo,18) from table1
      

  2.   

    select NAME,left(ltrim(rtrim(certificateNo)),18) from table1
      

  3.   

    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
    select dbo.f_filter('440722198606011151?'),dbo.f_filter('a?440722weir2198606011151?')
      

  4.   

    create table #
    (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
      

  5.   

    我弄錯了
    樓上的正確
    create table #
    (NAME varchar(5),  certificateNo varchar(25))
    insert into # select '001',     '44072219860601115x?'
    select name,substring(certificateNo,patindex('%[0-9]%',certificateNo),18)[certificateNo] from #
      

  6.   

    sdhylj(青锋-SS(期待Solaris光盘)) 
    这些日子很有激情阿!看来是快生啦!
      

  7.   

    函数不懂啊,大哥好人做到底吧,就是bankaccount表的字段certificateNo,大概有几百条身份证号大于18位后者前后怪字符.  你就写一个粘贴过去就能执行的吧.另:to pop w75251455(砍破),身份证号中可能还有字母吧 大小写X,奈何?
      

  8.   

    update bankaccount set certificateno=substring(certificateno,1,18) where len(certificateno)>18  这样写问题大吗?
      

  9.   

    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 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
      

  10.   

    --增加对X的处理
    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
      

  11.   

    declare @i int
    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
      

  12.   

    另:to pop w75251455(砍破),身份证号中可能还有字母吧 大小写X,奈何?
    ----------------------------------------------------------
    如果看懂了~~就别问看不懂的问题
    如果看不懂~~就动手测~~~别浪费时间
      

  13.   

    我觉得不需要考虑太多,left(trim(certificateNo),18),
    对其的过滤不要放在数据库中做,在写入数据库的时候就应该验证