改进left函数,截取varchar需要的字符串长度

--由于varchar(200)中的200代表字节数,而常用的left,right,subsring统函数中的参数却是字符数
--这样截取的长度直接插入到varchar中会出现截断错误,所有现在改进left函数通(字节数内部转换为字符数)
--注意:汉字和单个字符的字节数是不一样的,汉字占用两个字节但不能分开,所以最后两个字符必须判断
--比如你需要20个字节:19个字母加+1个汉字,那么最后一个汉字要去除,不然结果就是21,这样还是会截断
ALTER function [dbo].[f_newleft](@in_str varchar(max),@in_len int)
returns varchar(max)
as
begin
declare @i int,@len int,@out_str varchar(max)
set @i=1
set @len=0
set @out_str=''

while @i<=len(@in_str) and @len<@in_len
begin
    if datalength(substring(@in_str,@i,1))=2
    begin
        set @len=@len+2
        set @i=@i+1
    end
    else
    begin
        set @len=@len+1
        set @i=@i+1
    end
end

if @i>1 and datalength(left(@in_str,@i-1))>@in_len
begin
    set @out_str=left(@in_str,@i-2)
end
else
begin
    set @out_str=left(@in_str,@i-1)
end

return @out_str

猜你喜欢

转载自blog.csdn.net/lujichao520/article/details/46841173