Могу ли я сделать построитель строк в select, чтобы добавить все строки вместо того, чтобы запускать курсор в SQL? - PullRequest
0 голосов
/ 26 апреля 2020

Наш код принимает входной файл данных, а затем мы читаем его построчно, возвращая строки, в которых мы нашли цены в наших системах. Как бы то ни было, если мы не можем найти Mfr и модель, чтобы получить цену за возвращаемую цитату, я все равно возвращаю строку, которая в том виде, в каком она есть, но затем либо нечеткий поиск по производителю или модели (что когда-либо не было найдено, предлагая предложения, которые пользователь может выбрать по умолчанию для своп-совместимой или совместимой цены для строки.

Снимок экрана с результатами и использованием ниже:

Элемент, когда найдены отправленные элементы предложения клиента, и мы получаем цена, когда они абсолютно не найдены и должны быть добавлены в наш основной прайс-лист. Однако, если вы посмотрите на желтый и на втором скриншоте, вы увидите, как я возвращаю предложение, которое пользователь может выбрать, если мы думаем, что typo et c, но данные найдены. Например, в нашей системе мы храним «HP» и модель «T100», но импортированный клиентский файл содержит «Agilent / HP» и модель «T-100». для гигантских кавычек в 10k, 20k и около 100k время от времени. Так как это тяжелая обработка, я использую курсор, чтобы найти все похожие результаты, и возвращаю ng это как группа разделителей строк для отображения в выпадающем списке подсказок. Это приводит к снижению производительности до SQL и резко замедляется. Можно ли как-то обработать отображение кода курсора в этом примере, как во втором примере?

Графика c с предложениями и результатами примера веб-приложения: enter image description here Теперь вот текущий пример, и он не может делать это до 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','')
...