我现在需要做一个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床