Я работаю над системой продажи билетов, где пользователь может купить билеты на мероприятия. Для данных событий мы полагаемся на различные поставщики питания. Здесь проблема заключается в том, что каждый поставщик будет вызывать каждое событие по-другому, но будет некоторое сходство.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 минут. Может ли кто-нибудь помочь мне в оптимизации выше.
Можете ли вы добавить пример параметров, которые вы передаете? И почему вы разделили раскол продукта? что такое 'dbo.trim'? – shahkalpesh
@shahkalpesh - Productheader - это название мероприятия. Мне нужно найти события с похожими именами. Некоторый провайдер может сказать событие с именем «Jaki Graham», и какой-то орган может сказать «GRAHAM BONNETT». Поэтому мне нужно найти все события с похожими именами. – Naresh
Вы пытаетесь найти событие с похожими словами в нем за раз? Разве это не имело бы смысла искать событие по времени? Наверное, это то, на что вы смотрите. – shahkalpesh