2013-06-29 2 views
1

사용자가 이벤트 티켓을 구입할 수있는 티켓팅 시스템에서 작업 중입니다. 이러한 이벤트 정보를 위해 우리는 다른 공급 업체 피드에 의존합니다. 여기서 문제는 각 공급 업체가 각 이벤트를 다른 방식으로 호출하지만 유사점이 있음을 의미합니다.SQl 서버 - 테이블에 비슷한 열이있는 행 찾기

그래서 이벤트 정보를 테이블에 삽입하기 전에 유사한 쇼가있는 이벤트가 있는지 알아야합니다. 유사한 이벤트가있는 경우 우리는 장소, 날짜 등을 확인하는 필터 메커니즘이 더 있습니다.

첫 번째 단계에서 유사한 이벤트를 찾으려면 다음을 수행하고 있습니다.

새 이벤트 이름을 문자열 배열로 분할 (커서 사용). 모든 항목을 반복하고 비슷한 이름의 이벤트를 찾는 것 (like를 사용). 그리고 모든 레코드를 임시 테이블에 삽입하십시오.

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 

이하 그러나 성능은 현명한 위에서 많은 시간을 복용 논리를 언급했다. 4k 레코드의 경우 10 분 이상 걸립니다. 누가 위의 최적화에 나를 도울 수 있습니다. 내가 착각하고 있지 않다 경우

+0

전달한 매개 변수의 예를 추가 할 수 있습니까? 그리고 왜 제품 헤더를 분할 했습니까? 'dbo.trim'은 무엇입니까? – shahkalpesh

+0

@shahkalpesh - Productheader는 이벤트 이름입니다. 비슷한 이름의 이벤트를 찾아야합니다. 일부 제공자는 이름이 'Jaki Graham'인 이벤트를 말하고 일부 바디는 'GRAHAM BONNETT'라고 말할 수 있습니다. 그래서 비슷한 이름의 모든 이벤트를 찾아야합니다. – Naresh

+0

시간대에 비슷한 단어가 포함 된 이벤트를 찾으려고합니까? 시간대별로 이벤트를 검색하는 것이 의미가 있지 않습니까? 나는 그것이 당신이보고있는 것이라고 생각합니다. – shahkalpesh

답변

0

, 다음으로 while 루프를 대체 할 수

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]%' 

이 성능을 개선한다.