Наш код принимает входной файл данных, а затем мы читаем его построчно, возвращая строки, в которых мы нашли цены в наших системах. Как бы то ни было, если мы не можем найти Mfr и модель, чтобы получить цену за возвращаемую цитату, я все равно возвращаю строку, которая в том виде, в каком она есть, но затем либо нечеткий поиск по производителю или модели (что когда-либо не было найдено, предлагая предложения, которые пользователь может выбрать по умолчанию для своп-совместимой или совместимой цены для строки.
Снимок экрана с результатами и использованием ниже:
Элемент, когда найдены отправленные элементы предложения клиента, и мы получаем цена, когда они абсолютно не найдены и должны быть добавлены в наш основной прайс-лист. Однако, если вы посмотрите на желтый и на втором скриншоте, вы увидите, как я возвращаю предложение, которое пользователь может выбрать, если мы думаем, что typo et c, но данные найдены. Например, в нашей системе мы храним «HP» и модель «T100», но импортированный клиентский файл содержит «Agilent / HP» и модель «T-100». для гигантских кавычек в 10k, 20k и около 100k время от времени. Так как это тяжелая обработка, я использую курсор, чтобы найти все похожие результаты, и возвращаю ng это как группа разделителей строк для отображения в выпадающем списке подсказок. Это приводит к снижению производительности до SQL и резко замедляется. Можно ли как-то обработать отображение кода курсора в этом примере, как во втором примере?
Графика c с предложениями и результатами примера веб-приложения: Теперь вот текущий пример, и он не может делать это до n (25) поверх логарифма нечеткого поиска и должен замедляться.
if((select top 1 1 from Products_OurProducts_Products where clean_mfr = @objectManufacturer)>0)
begin
if(LEN(@objectModel)> 0)
begin
set @SuggestionsListCursor = cursor for
select top 4 Manufacturer,ManufacturerPartNumber,Description as ManufacturerDescription, Price,fms.Score
from Products_OurProducts_Products
CROSS APPLY (
select
dbo.FuzzyControlMatch(@objectModel, ManufacturerPartNumber) AS score
) AS fms
--where LEN(ManufacturerPartNumber) < LEN(@objectManufacturer)+5
order by fms.score desc, LEN(ManufacturerPartNumber)
open @SuggestionsListCursor
fetch next from @SuggestionsListCursor
into @CURSOR_Mfr,@CURSOR_Model,@CURSOR_Desc,@CURSOR_Price,@CURSOR_Score
while @@FETCH_STATUS = 0
begin
if(@CURSOR_Score > @topMaxScore)
begin
set @topMaxScore = @CURSOR_Score
set @topmaxPrice = @CURSOR_Price --keep shifting price for the max find
end
if @suggestionsStringBuilder!=''
set @suggestionsStringBuilder += + @CURSOR_Mfr + '*' + @CURSOR_Model + '*' + @CURSOR_Desc + '*' + convert(varchar(20),@CURSOR_Price) + '*' + convert(varchar(4),@CURSOR_Score) + '^'
else
set @suggestionsStringBuilder += @CURSOR_Mfr + '*' + @CURSOR_Model + '*' + @CURSOR_Desc + '*' + convert(varchar(20),@CURSOR_Price) + '*' + convert(varchar(4),@CURSOR_Score) + '^'
fetch next from @SuggestionsListCursor
into @CURSOR_Mfr,@CURSOR_Model,@CURSOR_Desc,@CURSOR_Price,@CURSOR_Score
end
--Now we insert the original Mfr, Model, Desc AND now the new suggestions list we built
insert into BASE (QWID,Manufacturer,ManufacturerPartNumber,ManufacturerDescription,Serial,AssetID,Price,Score,ItemType,MfrFound,ModelFound,trained, SuggestionList,LineNumberIn,ManufacturerOrig,ManufacturerPartNumberOrig,QWDescription)
values('-1',@objectORIGMfr,@objectORIGModel,@objectDescription,@objectSerialNumber,@objectAssetID,'0.00',@topMaxScore,'NA','1','0',@trained,@suggestionsStringBuilder,@objectLineNumber,@objectORIGMfr,@objectORIGModel,'')
close @SuggestionsListCursor
deallocate @SuggestionsListCursor
end
Сохранит ли это кучу обработки, а также достигнет sh моей цели без необходимости делать курсор, выполняя что-то вроде следующего (я знаю, что синтаксис на данный момент неверен, но для подтверждения концепции) ).
set @suggestionsStringBuilder = (select top 4 Manufacturer + '*',ManufacturerPartNumber + '*',Description + '*' as ManufacturerDescription, Price + '*',fms.Score +'^'
from Products_OurProducts_Products
CROSS APPLY (select
dbo.FuzzyControlMatch('TD20 CA', ManufacturerPartNumber) AS score
) AS fms
order by fms.score desc
--Now we insert the original Mfr, Model, Desc AND now the new suggestions list we built
/* Now try to take the highest scored rows, and build string that is delimiter so it can be stored under the sugestionList column as one string like above, but without the cursor overhead.
insert into BASE (QWID,Manufacturer,ManufacturerPartNumber,ManufacturerDescription,Serial,AssetID,Price,Score,ItemType,MfrFound,ModelFound,trained, SuggestionList,LineNumberIn,ManufacturerOrig,ManufacturerPartNumberOrig,QWDescription)
values('-1','origmfr','orogmodel','origidesc','origserial','origasset',CAST('0.00' as money),'max score','NA','1','0','1',@suggestionsStringBuilder,'linenumber','origmfr','origmodel','')