我也在做相同的问题,下面的是我的方案.参考一下.希望有人能优化一下.因为在量大的时间,速度不是很理想. DROP FUNCTION F_StrCompareGO CREATE FUNCTION F_StrCompare(@str1 varchar(512),@str2 varchar(512)) RETURNS FLOAT AS BEGIN DECLARE @TABSTR TABLE (STRID INT,WORD VARCHAR(4)) DECLARE @LEN1 INT,@LEN2 INT,@I INT DECLARE @P1 FLOAT,@P2 FLOAT,@P3 FLOAT,@P4 FLOAT,@P FLOAT SELECT @LEN1=len(@str1) SELECT @LEN2=len(@str2) --将STR1插入到表变量中. SET @I=1 WHILE @I<@LEN1 BEGIN INSERT INTO @TABSTR VALUES(1,substring(@str1,@I,2)) SET @I=@I+1 END --将STR2拆分放到表变量中. SET @I=1 WHILE @I<@LEN2 BEGIN INSERT INTO @TABSTR VALUES(2,substring(@str2,@I,2)) SET @I=@I+1 END --统计,计算相似度. SELECT @P1=COUNT(*) FROM @TABSTR --所有的单词. SELECT @P2=SUM(SUMWORD) FROM ( SELECT COUNT(WORD) AS SUMWORD,WORD FROM @TABSTR GROUP BY WORD ) AS T WHERE SUMWORD>1 --出现两次以上的单词. SET @P=@P2/@P1 RETURN @PEND GOCREATE TABLE LX1 ( F1 VARCHAR(32), F2 VARCHAR(32) )INSERT INTO LX1 VALUES('1','浙江省农业大学') INSERT INTO LX1 VALUES('2','浙江省工业大学') INSERT INTO LX1 VALUES('3','浙江农业大学') INSERT INTO LX1 VALUES('4','浙江工业大学') INSERT INTO LX1 VALUES('5','浙江省杭州市农业大学')GOSELECT *,DBO.f_StrCompare(F2,'浙江农业大学') AS K FROM LX1 WHERE DBO.f_StrCompare(F2,'浙江农业大学')>0.66
DROP FUNCTION F_StrCompareGO
CREATE FUNCTION F_StrCompare(@str1 varchar(512),@str2 varchar(512))
RETURNS FLOAT
AS
BEGIN
DECLARE @TABSTR TABLE (STRID INT,WORD VARCHAR(4))
DECLARE @LEN1 INT,@LEN2 INT,@I INT
DECLARE @P1 FLOAT,@P2 FLOAT,@P3 FLOAT,@P4 FLOAT,@P FLOAT SELECT @LEN1=len(@str1)
SELECT @LEN2=len(@str2) --将STR1插入到表变量中.
SET @I=1
WHILE @I<@LEN1
BEGIN
INSERT INTO @TABSTR VALUES(1,substring(@str1,@I,2))
SET @I=@I+1
END --将STR2拆分放到表变量中.
SET @I=1
WHILE @I<@LEN2
BEGIN
INSERT INTO @TABSTR VALUES(2,substring(@str2,@I,2))
SET @I=@I+1
END --统计,计算相似度.
SELECT @P1=COUNT(*) FROM @TABSTR --所有的单词.
SELECT @P2=SUM(SUMWORD) FROM ( SELECT COUNT(WORD) AS SUMWORD,WORD FROM @TABSTR GROUP BY WORD ) AS T WHERE SUMWORD>1 --出现两次以上的单词.
SET @P=@P2/@P1
RETURN @PEND
GOCREATE TABLE LX1
(
F1 VARCHAR(32),
F2 VARCHAR(32)
)INSERT INTO LX1 VALUES('1','浙江省农业大学')
INSERT INTO LX1 VALUES('2','浙江省工业大学')
INSERT INTO LX1 VALUES('3','浙江农业大学')
INSERT INTO LX1 VALUES('4','浙江工业大学')
INSERT INTO LX1 VALUES('5','浙江省杭州市农业大学')GOSELECT *,DBO.f_StrCompare(F2,'浙江农业大学') AS K FROM LX1 WHERE DBO.f_StrCompare(F2,'浙江农业大学')>0.66