SQl服务器 - 在表中查找具有相似列的行

时间:2013-06-29 14:56:45

标签: sql sql-server sql-server-2008 tsql

我正在开发一个票务系统,用户可以在这里购买活动门票。对于这些活动信息,我们依赖于不同的供应商饲料。 这里的问题是每个供应商会以不同的方式调用每个事件,但会有一些相似之处。

因此,在将任何事件信息插入表格之前,我需要找出有类似节目的事件。如果有任何类似的事件,我们有更多的过滤机制,我们将检查场地,日期等。

要在第一步找出类似的事件,我正在做以下事情。

将新事件名称拆分为字符串数组(使用游标)。 循环遍历每个项目并查找具有相似名称的事件(使用类似)。 并将所有这些记录插入临时表。

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

Trim功能位于

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

但是上面提到的逻辑性能需要花费很多时间。仅4k记录就需要超过10分钟。有人可以帮助我优化上述内容。

1 个答案:

答案 0 :(得分: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]%'

这应该可以提高性能。