我现在需要做一个MS SQL Server的函数,目的是: 
有两个参数,@str varchar(1000)----输入的字符串, 
          @getlen int--------------截取的字符长度.从左边开始取 
难点:由于前边可能含有全角或中文,所以使用字符截取时,最后一位可能乱码,如果出现要求的长度最后一位是全角或中文时,则少取一个返回. create function (@str varhcar(1000),@getlen int) returns varchar 
例如: '1猪头猪头猪头猪头猪头猪头',10 
则返回'1猪头猪头', 

解决方案 »

  1.   

    if object_id('f_getchar') is not null
       drop function f_getchar
    go
    create function f_getchar
    (@str varchar(1000),
    @getlen int)
    returns varchar(1000)
    as
    begin
    declare @s varchar(100)
    set @s=''
    if datalength(right(@str,1))=2
       set @s=left(@str,@getlen/2)
    else
       set @s=left(@str,@getlen/2)
    return @s
    endselect dbo.f_getchar('1猪头猪头猪头猪头猪头猪头',10)1猪头猪头
      

  2.   

    create function (@str varhcar(1000),@getlen int) returns varchar
    as
    begin
      return left(@str,@getlen)
    end
      

  3.   

    建议,用CONVERT转换为NVarchar然后取就很简单了
    NVARCHAR一个汉字也算是一个字符
      

  4.   

    if object_id('r','fn') is not null 
    drop function r
    go
    create function r(@str varchar(1000),@getlen int) 
    returns varchar(1000)
    as
    begin
    declare @i int,@s varchar(1000),@s1 varchar(1000)
    select @i=0,@s='',@s1=@str
    while @i<=@getlen and @i<=datalength(@str)
    begin
    select @s=@s+left(@s1,1),@i=@i+datalength(left(@s1,1)),@s1=stuff(@s1,1,1,'')
    if @i+datalength(left(@s1,1))>@getlen
    return @s
    end
    return @s
    end
    goselect dbo.r('123床12',4)
    /*
    ---------------
    123
    */
    select dbo.r('12床12',4)
    /*
    ---------------
    12床
    */
    select dbo.r('1猪头猪头猪头猪头猪头猪头',10)
    /*
    ---------------
    1猪头猪头
    */
    select dbo.r('1猪头12',6)
    /*
    ---------------
    1猪头1
    */
      

  5.   

    直接一个CONVERT函数加上动态SQL即可实现了,
    declare @s varchar(100)
    declare @len int
    declare @sql  nvarchar(200)
    set @s ='1猪头猪头猪头'
    set @len=10
    set @sql ='select convert(varchar('+ltrim(str(@len))+'), '''+ltrim(@s)+''') '
    --print @sql
    exec(@sql)
    /*
    1猪头猪头
    */
    declare @s varchar(100)
    declare @len int
    declare @sql  nvarchar(200)
    set @s ='123创123'
    set @len=4
    set @sql ='select convert(varchar('+ltrim(str(@len))+'), '''+ltrim(@s)+''') '
    --print @sql
    exec(@sql)
    /*
    123
    */
      

  6.   

    哦,如果要函数的话,
    可能就只有遍历了,
    因为函数不支持动态SQL.
    没有想有没有其他合适的方式,