/* declare @str1 varchar(200),@str2 varchar(200) set @str1=N'江西省南昌市其它区高新区火炬大道809号' set @str2=N'江西省南昌市其它区高新区火炬大道809号' */ ALTER FUNCTION [dbo].[F_strcompare](@str1 nVARCHAR(200), @str2 nVARCHAR(200)) RETURNS numeric(3,2) AS BEGIN declare @returnvalue numeric(3,2) set @returnvalue=0 if len(@str1)=0 or LEN(@str2)=0 begin return @returnvalue end /*完全相等与完全包含*/ if @str1=@str2 or charindex(@str1,@str2)>0 or charindex(@str2,@str1)>0 begin set @returnvalue= 1.0 return @returnvalue end DECLARE @len INT, --长度 @min int, @pos INT, --累计符合个数 @currindex int, --上次匹配位置 @index int, --本次匹配位置 @k INT, @ret numeric(3,1), --相似度 @word nvarchar(200), --进行分解的字符串 @strsource nvarchar(200) --长度较大的字符串 select @pos=0,@index=0,@currindex=0,@k=0 select @len =( case when LEN(@str1)>LEN(@str2) then LEN(@str1) else LEN(@str2) end ), @min=( case when LEN(@str1)>LEN(@str2) then LEN(@str2) else LEN(@str1) end ) ,@word=( case when LEN(@str1)>LEN(@str2) then @str2 else @str1 end ) ,@strsource=( case when LEN(@str1)>LEN(@str2) then @str1 else @str2 end ) while @k < @len-1 begin select @index=charIndex(substring(@word,@k,1),@strsource) if @index > 0 and @index > @currindex begin set @pos = @pos+1 set @currindex=@index --print @index end set @k=@k+1 end --SET @ret = (CAST(@pos * 100.0 / @k AS NUMERIC(3, 0))) SET @ret= (@pos * 1.0 / @min) return @ret End --select @ret,@k,@pos,@len,@min