У меня есть хранимая процедура, которая заполняет временную таблицу:
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.Немного .Я думаю, что я буду обновлять эти данные только один раз в день.