SQl-server – searchn von Zeilen mit ähnlichen Spalten in einer Tabelle

Ich arbeite an einem Ticketing-System, wo der Benutzer Tickets für events kaufen kann. Für diese events info, die wir uns auf verschiedene Lieferanten beziehen, füttern. Hier ist das Problem, dass jeder Anbieter jedes Ereignis auf eine andere Art aufrufen würde, aber es wird eine Ähnlichkeit geben.

Also vor dem Einfügen von Event-Info in einen Tisch muss ich herausfinden, gibt es irgendwelche Ereignisse mit ähnlichen Shows. Wenn es irgendwelche ähnlichen events gibt, haben wir noch mehr Filtermechanismen, wo wir den Veranstaltungsort, die Termine und etc. überprüfen würden.

Um die ähnlichen Ereignisse im ersten Schritt herauszufinden, mache ich folgendes.

Aufteilen des neuen Ereignisnamens in String-Array (mit Cursor). loop durch jeden Gegenstand und das Finden der Ereignisse mit ähnlichem Namen (mit wie). Und alle diese datasätze in eine temporäre Tabelle insert.

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 '%[^az]'+dbo.trim(@Item)+'[^az]%' End FETCH NEXT FROM Items into @Item END CLOSE Items DEALLOCATE Items 

SplitString ist eine benutzerdefinierte function, die eine Tabelle zurückgibt.

 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 ba ELSE LEN(@str) end) AS Item from tokens ); 

Und die Trimmfunktion ist unten

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

Aber performance weise oben erwähnt Logik nehmen viel time. Nur für 4k Platten dauert es mehr als 10 Minuten. Könnte jemand mir bei der Optimierung helfen.

Wenn ich mich nicht irre, kannst du die while-loop durch folgendes replace:

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

Dies sollte die performance verbessern.