TSQL - пустые строки возвращаются в курсоре - PullRequest
0 голосов
/ 06 сентября 2018

извинения, так как это может быть очень глупый вопрос - я работаю с курсором, он соединяет временную таблицу из примерно 697K строк и функцию, которая возвращает 78K строк. (это я должен добавить, это улучшение, которое раньше было хуже) . Курсор проходит и сопоставляет два значения в обеих «таблицах» и обновляет третье. Это займет около 6 часов. Что абсурдно. Мы пытаемся найти способы сделать это более эффективным.

Любые и все предложения приветствуются. Но мой вопрос такой -

enter image description here

Похоже, что возвращаются данные, которые выглядят следующим образом (во многих случаях пустая информация). Могу ли я ограничить код, чтобы сказать, где ... данные не равны нулю ... но это не значит, что они возвращаются с нулем, пустые / несуществующие строки Я думаю, что если есть способ исключить такие строки, мы можем ограничить наш пул данных. Но я не совсем знаю, что это значит.

declare @season int = 21

DECLARE @match varchar(55)
declare @perf_no int
declare @order_dt datetime

DECLARE   @price CURSOR
SET       @price = CURSOR FOR
SELECT    distinct match_criteria, perf_no, order_dt
FROM      #prices
OPEN      @price
FETCH NEXT
FROM      @price INTO @match, @perf_no, @order_dt
WHILE     @@FETCH_STATUS = 0
BEGIN

select  @match, @perf_no, @order_dt, x.price as 'amount'
from    #prices p
join    dbo.[LFT_GET_PRICES_Seasonal] (@season, @order_dt) x on p.perf_price_type = x.perf_price_type and p.zone_no = x.zone_no
where   match_criteria = @match and perf_no = @perf_no

FETCH NEXT
FROM @price INTO @match, @perf_no, @order_dt
END
CLOSE @price
DEALLOCATE @price

Вот пример того, что #prices и # возвращает наша функция.

цена

pkg_no  perf_no zone_no price_type  order_dt                    price   perf_price_type match_criteria
12      144     2707    1073        2018-09-03  00:00:00.000    NULL    115769          O5716788P1517Z2707
12      123     2707    1073        2018-09-03  00:00:00.000    NULL    115840          O5716788P1517Z2707
12      887     2707    1073        2018-09-03  00:00:00.000    NULL    115521          O5716788P1517Z2707

Функция:

perf_price_type zone_no price   min_price   enabled editable_ind
115521          2678    12.00   12.00       Y       N
115521          2679    61.00   61.00       Y       N
115521          2680    41.00   41.00       Y       N

Курсор обновляет цену в таблице #prices на основе цены функции. (мы использовали курсор, чтобы ограничить его только определенными характеристиками / ограниченными критериями). Но я открыт для предложений. и совет относительно того, как улучшить это.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы написали, что хотите обновить таблицу #price результатами из функции с табличным значением.
Вы можете сделать это, используя cross apply вместо курсора. Поскольку вы не опубликовали примерные данные, у меня нет возможности проверить мой ответ, но если он делает то, что вам нужно, он должен работать молниеносно по сравнению с курсором.

DECLARE @season int = 21

UPDAET p
SET price = x.Price
FROM #Prices p
CROSS APPLY  
(
    SELECT * 
    FROM dbo.LFT_GET_PRICES_Seasonal(@season, order_dt) udf
    WHERE udf.perf_price_type = p.perf_price_type 
    AND udf.zone_no = p.zone_no
) x

SQL лучше всего работает с подходом, основанным на множестве, а не с процедурным подходом, поэтому вы хотите избегать циклов и курсоров, когда это возможно, и использовать их только в качестве последнего средства.

...