我有一個存儲過程的代碼。它在大約4分鐘內執行,這是很好的,但我的問題是,它創建的方式是隻刪除並重新創建表,但我希望它刪除一系列記錄,再次從源處理它們並在表中插入更新值。SQL存儲過程 - 修改代碼
的代碼是:
ALTER PROCEDURE [BW].[InventoryBalance_EndingBalance]
AS
BEGIN
SET NOCOUNT ON;
--DROP TABLE DataWhs.dbo.InventoryBalancesEnd
DELETE DataWhs.dbo.InventoryBalancesEnd
WHERE Period > (YEAR(GETDATE())-1)*100 + MONTH(GETDATE())+8
SELECT DISTINCT
C.Period, ib.Account, ib.SalesOrg, IB.ProfitCenter,
IB.ValueType, IB.Plant, ib.SubscriptionKey
INTO #Tempib6
FROM
DataWhs.dbo.InventoryBalances ib
CROSS JOIN
DataWhs.Dates.Cumulated c
WHERE
c.Period <= YEAR(GETDATE())*100 + MONTH(GETDATE())
ALTER TABLE #Tempib6
ADD [Amount_LC_EndBal] [numeric](18, 2),
[Amount_GC_EndBal] [numeric](18, 2);
UPDATE T1
SET T1.Amount_LC_EndBal = (SELECT SUM(T2.Amount_LC)
FROM DataWhs.dbo.InventoryBalances T2
WHERE T2.Period <= T1.Period
AND T1.Period NOT LIKE '%00'
AND T2.Period NOT LIKE '%00'
AND T1.Account = T2.Account
AND T1.ProfitCenter = T2.ProfitCenter
AND T1.SalesOrg = T2.SalesOrg
AND T1.ValueType = T2.ValueType
AND T1.Plant = T2.Plant),
T1.Amount_GC_EndBal = (SELECT SUM(T2.Amount_GC)
FROM DataWhs.dbo.InventoryBalances T2
WHERE T2.Period <= T1.Period
AND T1.Period NOT LIKE '%00'
AND T2.Period NOT LIKE '%00'
AND T1.Account = T2.Account
AND T1.ProfitCenter = T2.ProfitCenter
AND T1.SalesOrg = T2.SalesOrg
AND T1.ValueType = T2.ValueType
AND T1.Plant = T2.Plant)
FROM #Tempib6 T1;
SELECT *
INTO dbo.InventoryBalancesEnd
FROM #Tempib6
WHERE
#Tempib6.Amount_LC_EndBal IS NOT NULL
AND #Tempib6.Amount_LC_EndBal <> 0
--(to remove comment after first full load) and #Tempib6.Period >
--(YEAR(GETDATE())-1)*100 + MONTH(GETDATE())+8
DROP TABLE #Tempib6
END
感謝
這不是一個問題,即使你稱之爲一個。 – Jodrell 2015-03-31 15:22:24
哪個RDBMS是爲了這個?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 – 2015-03-31 15:43:33
你的問題到底是什麼? – 2015-03-31 15:54:30