2013-06-29 5 views
1

Я работаю над системой продажи билетов, где пользователь может купить билеты на мероприятия. Для данных событий мы полагаемся на различные поставщики питания. Здесь проблема заключается в том, что каждый поставщик будет вызывать каждое событие по-другому, но будет некоторое сходство.SQl server - Поиск строк с похожими столбцами в таблице

Поэтому, прежде чем вставлять какую-либо информацию о событии в таблицу, мне нужно выяснить, есть ли какие-либо события с похожими шоу. Если есть какие-либо подобные события, у нас есть еще один механизм фильтрации, где мы будем проверять место проведения, даты и т. Д.

Чтобы узнать о похожих событиях на первом шаге, я делаю следующее.

Разбиение нового имени события на строковый массив (с помощью курсора). Проникновение через каждый элемент и поиск событий с похожим именем (с использованием подобных). И вставка всех этих записей в временную таблицу.

DECLARE @TmpTable TABLE (ProductHeaderID int, Name varchar(200)) 

DECLARE @TmpAddress TABLE (AddressId int) 

DECLARE @Item Varchar(100) 
DECLARE Items CURSOR LOCAL FOR select Item from dbo.SplitString(@ProductHeader,' ') 

OPEN Items 
FETCH NEXT FROM Items into @Item 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    If dbo.Trim(@Item) <> '-' and dbo.Trim(@Item) <> ' ' and LEN(dbo.Trim(@Item)) > 3 
    Begin 
     --Print @Item 
     Insert into @TmpTable (ProductHeaderID,Name) 
      Select ProductHeaderID,Name from Product.ProductHeaderRepository 
      Where Name LIKE '%[^a-z]'+dbo.trim(@Item)+'[^a-z]%' 
    End 
    FETCH NEXT FROM Items into @Item 
END 

CLOSE Items 
DEALLOCATE Items 

SplitString - это пользовательская функция, которая возвращает таблицу.

ALTER function [dbo].[SplitString] 
(
    @str nvarchar(max), 
    @separator char(1) 
) 
returns table 
AS 
return (
with tokens(p, a, b) AS (
    select cast(1 as bigint), cast(1 as bigint), charindex(@separator, @str) 
    union all 
    select p + 1,b + 1, charindex(@separator, @str, b + 1) from tokens where b > 0 
) 
select p-1 ItemIndex,substring(@str, a, case when b > 0 then b-a ELSE LEN(@str) end) AS Item from tokens 
); 

И Обрезать функция ниже

ALTER FUNCTION [dbo].[TRIM](@string VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) 
BEGIN 
RETURN LTRIM(RTRIM(@string)) 
END 

Но производительность мудрая выше логики принятия много времени. Всего за 4 тыс. Записей он занимает более 10 минут. Может ли кто-нибудь помочь мне в оптимизации выше.

+0

Можете ли вы добавить пример параметров, которые вы передаете? И почему вы разделили раскол продукта? что такое 'dbo.trim'? – shahkalpesh

+0

@shahkalpesh - Productheader - это название мероприятия. Мне нужно найти события с похожими именами. Некоторый провайдер может сказать событие с именем «Jaki Graham», и какой-то орган может сказать «GRAHAM BONNETT». Поэтому мне нужно найти все события с похожими именами. – Naresh

+0

Вы пытаетесь найти событие с похожими словами в нем за раз? Разве это не имело бы смысла искать событие по времени? Наверное, это то, на что вы смотрите. – shahkalpesh

ответ

0

Если я не ошибаюсь, вы можете заменить время цикла следующим:

Insert into @TmpTable (ProductHeaderID,Name) 
Select ProductHeaderID,Name from Product.ProductHeaderRepository 
join dbo.SplitString(@ProductHeader,' ') t on Name LIKE '%[^a-z]'+dbo.trim(t.Item)+'[^a-z]%' 

это должно повысить производительность.

Смежные вопросы