现在的位置: 首页 > 综合 > 正文

按字节取字符串函数

2012年11月16日 ⁄ 综合 ⁄ 共 1378字 ⁄ 字号 评论关闭

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

create function (@str varhcar(1000),@getlen int) return @str varchar
例如: '132床',4
则返回'132',

 

 

-->解题代码:

 

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
go

select 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
*/

 

create function f_str(
   
@str varchar(1000),
   
@getlen int
)
returns varchar(1000)
as
begin
   
return(
       
convert(varchar(1000),
           
left(
               
convert(varbinary(1000), @str), @getlen - case
                           
when LEN(CONVERT(nvarchar(2), CONVERT(varchar(2), SUBSTRING(CONVERT(varbinary(1000), @str), @getlen, 2)))) = 1 THEN 1
                           
else 0
                       
end
            )
        )
    )
end;
go

select
    dbo.f_str(
'123床', 4),
    dbo.f_str(
'12床', 4);
go

drop function dbo.f_str;

结果:
------- --------
123 12床

抱歉!评论已关闭.