Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Все наверное знают как можно искать что то в базе данных, напр:

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

Если будут вопросы, пишите, дополню чего не хватает....

Чтото с оформлением здесь не то.... всьо сбило под левий угол (