--创建用户定义函数
create function f_getstr(@str varchar(8000))
returns varchar(8000)
as
begin
    declare @i int
    set @i = 1
    while(datalength(substring(@str,@i,1))=1)
    begin
        set @i = @i + 1
    end
    
    set @str = left(@str,@i-1)
    return @str
end
go--执行调用
select dbo.f_getstr('asdfasdf由IC卡生')
--输出结果
/*
--------
asdfasdf
*/

解决方案 »

  1.   

    假设你的表为table1,你要查询的字段为code,则可以这么写:
    select substring(code,1, case  patindex('%[吖-做]%',code) when 0 then len(code) else   patindex('%[吖-做]%',code)-1 end ) from table1当然前提时你的汉字编码是GB2312。这样的话第一个汉字为'吖',最后一个为'做'
      

  2.   

    create function f_1(@str varchar(4000))
    returns varchar(4000)
    as
    begin
    declare @i int,@s varchar(4000)
    set @i=1
    set @s=''
    while @i<=len(@str)
    begin
    if DATALENGTH(substring(@str,@i,1))=1
    set @s=@s+substring(@str,@i,1)
    else
    break
    set @i=@i+1
    end
    return @s
    end
    goselect dbo.f_1('123fdsa哈哈dsa')
    /*
    ---------------
    123fdsa(所影响的行数为 1 行)
    */drop function dbo.f_1
      

  3.   

    当然如果你的汉字编码为GBK这应该用相应的字符集汉字。GB2312编码的第一个汉字为'吖',最后一个为'做'
      

  4.   


    declare @a varchar(100)
    set @a ='123fdsa哈哈dsa'
    print left(@a,patindex('%[吖-做]%',@a)-1)
      

  5.   


    /*
        利用正则表达式替换字符
        调用:    1.获取字符串中的英文字符
        declare @str varchar(100)
        set @str='xyz123z5'
        select dbo.regexReplace(@str,'[^a-zA-Z]','',1,1)    2.获取字符串中的英文字符长度
        declare @str varchar(100)
        set @str='xyz123z5'
        select len(dbo.regexReplace(@str,'[^a-zA-Z]','',1,1))
        
    */
    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
    endreturn @result
    end
    GO--调用
    declare @str varchar(100)
    set @str='123fdsa哈哈dsa'
    select dbo.regexReplace(@str,'^([^\u4E00-\u9FA5]+)[\u4E00-\u9FA5]+\w+$','$1',1,1)--结果
    /*
    -----------------------
    123fdsa(所影响的行数为 1 行)
    */
      

  6.   

    看来yjdn(无尽天空)的工作现在稳定了,^_不过sql有点问题,如果没有汉字的话是不正确的,改一下declare @a varchar(100)
    set @a ='123fdsadsa吖'print left(@a,case patindex('%[吖-做]%',@a) when 0 then len(@a) else  patindex('%[吖-做]%',@a)-1 end )
      

  7.   

    yjdn(无尽天空)在我这里,不成功!我很纳闷
      

  8.   

    create function f_getstr(@str varchar(8000))
    returns varchar(8000)
    as
    begin
        declare @i int
        set @i = 1
        while(datalength(substring(@str,@i,1))=1)
        begin
            set @i = @i + 1
        end
        
        set @str = left(@str,@i-1)
        return @str
    end
    go
      

  9.   

    declare @a varchar(100)
    set @a ='123fdsadsa吖'print left(@a,case patindex('%[吖-做]%',@a) when 0 then len(@a) else  patindex('%[吖-做]%',@a)-1 end )
      

  10.   

    回复人: MorningTea(一勺抹茶) ( ) 信誉:100  2005-09-19 18:31:00  得分: 0  
     
     
       yjdn(无尽天空)在我这里,不成功!我很纳闷
      
     
    ----试试下面的
    declare @a Nvarchar(100)
    set @a =N'123fdsa哈哈dsa'
    print left(@a,patindex(N'%[吖-做]%',@a)-1)---------------------------------
    看来yjdn(无尽天空)的工作现在稳定了,^_
    --算是吧,在杭州出差,可能在这呆半年
      

  11.   

    --如果非得避免case的话可以:
    declare @a Nvarchar(100)
    set @a =N'123fdsadsa'
    print left(@a+N'阿',patindex(N'%[吖-做]%',@a+N'阿')-1)
      

  12.   

    declare @a varchar(100)
    set @a ='123fdsadsa吖'print left(@a,case patindex('%[吖-做]%',@a) when 0 then len(@a) else  patindex('%[吖-做]%',@a)-1 end )