2013-06-29 18 views
1

我正在購票系統上工作,用戶可以購買事件的票證。對於這些活動信息,我們依靠不同的供應商飼料。 這裏的問題是每個供應商都會以不同的方式調用每個事件,但會有一些相似之處。SQl服務器 - 在表格中查找具有相似列的行

因此,在將任何事件信息插入表格之前,我需要找出是否有類似節目的事件。如果有任何類似的事件,我們有更多的過濾機制,我們將檢查場地,日期等。

要了解第一步中的類似事件,我正在做以下工作。

將新事件名稱拆分爲字符串數組(使用遊標)。 循環瀏覽每個項目並查找類似名稱的事件(使用類似)。 並將所有這些記錄插入臨時表中。

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 
); 

和修整功能低於

​​

但性能明智的上述邏輯服用大量的時間。僅用於4k記錄需要超過10分鐘。有人可以幫助我優化上述。

+0

你可以添加一個你傳遞的參數的例子嗎?而且,爲什麼要拆分productheader?什麼是'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]%' 

這應該提高性能。

相關問題