Продвинутый поиск

Все наверное знают как можно искать что то в базе данных, напр:
1. select * from ... where SomeField=SomeSearch (самый быстрый, ищет точные совпадения)
2. select * from ... where SomeField like %SomeSearch% (медленный, ищет точные вхождения)
3. и мой метод, он разработан на основе алгоритма MetaPhone, он позволяет искать на подобии оператора Like, но с некоторой точностью, напр. частенько нужно проверять не на точною соответственность, а на некоторою вероятность совпадения, как раз это я и попиталса сделать. (Заточено под MS SQL 97).
Привожу полный текст:
CREATE PROCEDURE dbo.StrCompareEx (@p varchar(255), @t varchar(255), @maxdist tinyint)
--RETURNS integer
AS
BEGIN
/* Compare two Strings, maxlen=255, @maxdist = max len to compare strings, use 100 = max len field [StoreList].[Name] */
DECLARE @dist tinyint
DECLARE @d varchar(255)
DECLARE @dp varchar(255)
DECLARE @dt varchar(255)
DECLARE @plen tinyint
DECLARE @tlen tinyint
SELECT @plen = LEN(@p)
SELECT @tlen = LEN(@t)
DECLARE @i tinyint
DECLARE @j tinyint
SELECT @i = 1
SELECT @d = ''
WHILE @i<@plen <="" p="">
BEGIN
SELECT @d = @d char(@i)
SELECT @i = @i + 1
END
DECLARE @dst1 tinyint
DECLARE @dst2 tinyint
DECLARE @dst3 tinyint
DECLARE @dst4 tinyint
DECLARE @ct varchar(1)
DECLARE @ctp varchar(1)
SELECT @ctp=''
SELECT @j = 1
WHILE @j<@tlen <="" p="">
BEGIN
SELECT @ct = substring(@t,@j,1)
SELECT @i = 1
SELECT @dt = NULL
WHILE @i<@plen <="" p="">
BEGIN
IF @i = 1
SELECT @dst1 = @j-1
ELSE
SELECT @dst1 = ASCII(substring(@d,@i-1,1))
IF @ct
SELECT @dst1 = @dst1 + 1
SELECT @dst2 = ASCII(substring(@d,@i,1))+1
IF @i = 1
SELECT @dst3 = @j +1
ELSE
SELECT @dst3 = ASCII(substring(@dt,@i-1,1)) + 1
SELECT @dst4 = @dst1
IF @j > 1 and @i > 1
IF @ctp = substring(@p,@i,1) and @ct = substring(@p,@i-1,1)
BEGIN
IF @i = 2
SELECT @dst4 = @j - 2 + 1
ELSE
SELECT @dst4 = ASCII(substring(@dp,@i-2,1)) + 1
END
DECLARE @dst tinyint
SELECT @dst = @dst1
IF @dst2 <@dst <="" p="">
SELECT @dst = @dst2
IF @dst3 <@dst <="" p="">
SELECT @dst = @dst3
IF @dst4 <@dst <="" p="">
SELECT @dst = @dst4
IF @i >1
SELECT @dt = @dt char(@dst)
ELSE
SELECT @dt = char(@dst)
SELECT @i = @i + 1
END
SELECT @ctp = @ct
SELECT @dp = @d
SELECT @d = @dt
SELECT @j = @j + 1
END
SELECT @dist = ASCII(substring(@d,@plen,1))
IF @dist > @maxdist + 1
SELECT @dist = @maxdist + 1
RETURN @dist
END
CREATE PROCEDURE dbo.StrCompareExSpecific
@ComparedStr varchar(100) -- str to compare
AS
BEGIN
declare @StoredProcName varchar(50); set @StoredProcName=OBJECT_NAME(@@PROCID);
EXEC [GetAccess] @StoredProcName, 0, 0, 'Вивід схожий по назві в номенклаторі';
if exists (select * from tempdb..sysobjects where name ='#tempS') drop table #tempS
CREATE TABLE [dbo].[#tempS] (
[ID] int IDENTITY(1, 1) NOT NULL,
[aID] int NOT NULL,
[Sname] varchar(100) NOT NULL,
[dist] int NOT NULL
)
ON [PRIMARY]
DECLARE @RetCode [int]
declare @id int -- cursor ID
declare @fname varchar(255) -- cursor our name to compare, fack you bill, stuped idiot, don't include Functions in to MS SQL 97 !!!
if (select count(*) from storelist where [name]=ltrim(rtrim(@ComparedStr)))>0
begin
raiserror('Данна позиція уже існує, запис неможливий!', 16, 1);
-- select @ttt=1; -- use for outher break), small hack for stuped)
end
declare Names_Cursor cursor for
select storeid, [Name] as 'sname'
from storelist
where (len([Name])>len(@ComparedStr)-len(@ComparedStr)/4) and (len([Name])
FOR READ ONLY
OPEN Names_Cursor
FETCH NEXT FROM Names_Cursor
INTO @id, @fname
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC @RetCode = [dbo].[StrCompareEx] @ComparedStr, @fname, 100
if 100-@RetCode > 85
insert #tempS
(aID, SName, dist)
values (@id, @fname, 100-@RetCode)
FETCH NEXT FROM Names_Cursor
INTO @id, @fname
END
CLOSE Names_Cursor
DEALLOCATE Names_Cursor
select *
from #tempS
order by dist desc;
END
Если будут вопросы, пишите, дополню чего не хватает....
Чтото с оформлением здесь не то.... всьо сбило под левий угол (