我有一个存储过程的代码。它在大约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