MSSQL хранимая процедура / временная таблица / обновление нескольких строк / использование TOP 1 - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть хранимая процедура, которая заполняет временную таблицу:

ALTER PROCEDURE [dbo].[spBestellungStand]
(
    @Start datetime,
    @Stop datetime
)
as
BEGIN
    create TABLE #tempLocal(
        AB int,
        AH_IDENT int,
        AH_NAME1 nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS,
        STATUS int,
        DATUM_ERF datetime,
        FI_BETR_NETTO float,
        BEST_TEXT2 nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS,
        FI_ZAHLBED nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS,
        DB_YEAR int,
        WARENEINGANG datetime,
        AB_LIEFERANT nvarchar(50),
        NR_RECHNUNG nvarchar(50),
        DATUM_RECHNUNG datetime,
        AB_LIEFERANT2 nvarchar(50),
        NR_RECHNUNG2 nvarchar(50),
        DATUM_RECHNUNG2 datetime,       
        AB_LIEFERANT3 nvarchar(50),
        NR_RECHNUNG3 nvarchar(50),
        DATUM_RECHNUNG3 datetime,   
        CUST_AH_IDENT int,
        CUST_AH_NAME1 nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS,
        CUST_FI_BETR_NETTO float,
        CUST_DB_YEAR int,
        CUST_LIEFERSCHEIN datetime,
        CUST_RECHNUNG datetime      
    )


    insert into #tempLocal
        select AB,AH_IDENT,AH_NAME1,STATUS,DATUM_ERF,FI_BETR_NETTO,SUBSTRING(BEST_TEXT2,1,LEN(BEST_TEXT2)-CHARINDEX('/',BEST_TEXT2,1)+1) as Best_Text2,
        FI_ZAHLBED,DB_YEAR,null,'','',null,'','',null,'','',null,null,null,null,null,null,null
        from BW_BEST_KOPF
        --where DATUM_ERF >= @start and DATUM_ERF <= @stop

    -- WARENEINGANG 
    update #tempLocal 
    set WARENEINGANG=convert(date, (select top 1 DATUM from BW_BEST_HIST where AB=#tempLocal.AB and DB_YEAR=#tempLocal.DB_YEAR
    and STATUS_ID in (61,62) order by DATUM desc))

    -- AB LIEFERANT, NR RECHNUNG , DATUM RECHNUNG 
    update #tempLocal
      set AB_LIEFERANT = CD.AB_LIEFERANT, NR_RECHNUNG = CD.NR_Rechnung, DATUM_RECHNUNG = CD.Rech_Datum
    from
    (
    select top 1 AB_LIEFERANT, NR_Rechnung, Rech_Datum from BW_BEST_MAN
    where BW_BEST_MAN.BEST_ID = #tempLocal.AB
    order by BW_BEST_MAN.DB_YEAR desc
    ) as CD

Я получаю сообщение об ошибке из диспетчера SQL, что # tempLocal.AB Не удалось связать многоэлементный идентификатор "# tempLocal.AB",Что я здесь не так делаю?

Примечание: здесь была текущая часть обновления, она работает, но я подумал, что, возможно, я без необходимости выбираю 3 раза, тогда как я мог бы сделать это один раз.

update #tempLocal
set AB_LIEFERANT=(select top 1 AB_LIEFERANT from BW_BEST_MAN where BEST_ID=#tempLocal.AB order by DB_YEAR desc),
    NR_RECHNUNG=(select top 1 NR_Rechnung from BW_BEST_MAN where BEST_ID=#tempLocal.AB order by DB_YEAR desc),
    DATUM_RECHNUNG=(select top 1 Rech_Datum from BW_BEST_MAN where BEST_ID=#tempLocal.AB order by DB_YEAR desc)

Любая помощь приветствуется.Спасибо.

ОБНОВЛЕНИЕ 1:

Итак, мне удалось сделать это:

update #tempLocal
  set AB_LIEFERANT = CD.AB_LIEFERANT,
      NR_RECHNUNG = CD.NR_Rechnung,
      DATUM_RECHNUNG = CD.Rech_Datum
from
(select AB_LIEFERANT, NR_Rechnung, Rech_Datum, BEST_ID, DB_YEAR from BW_BEST_MAN) as CD
 where cd.BEST_ID = #tempLocal.AB and cd.DB_YEAR = ( select MAX(DB_YEAR) from BW_BEST_MAN where BEST_ID = #tempLocal.AB )

это работает, но я не уверен на 100%если это экономит мне ресурсы сервера.Это лучше, чем 3-кратный подзапрос с TOP1?

ОБНОВЛЕНИЕ 2:

хорошо, похоже, что использование одного запроса дает мне большую скорость, 3xподзапрос был каждый раз 00:00:41 тогда один запрос каждый раз 00:00:33.Немного .Я думаю, что я буду обновлять эти данные только один раз в день.

...