需要帮助来优化我的存储过程

时间:2019-09-26 17:39:26

标签: sql sql-server stored-procedures triggers

我需要优化我的存储过程的帮助。这是针对我们的事实表的,当前存储过程将截断该表,然后将数据加载回。我想摆脱截断,而是通过last_update列(当前不存在)追加新行或删除行。还有一个带有一列的last_update表,该表在每次存储过程运行时都会更改,但是我宁愿last_update是表本身中的一列,而不是单独的一列。

我创建了一个触发器,该触发器应在存储过程运行时以当前日期更新last_updated列,但我也想摆脱截断,而是附加/删除行。当前存储过程的结构方式使我很难弄清楚如何做到最好。

存储过程首先将数据添加到2个临时表中,然后将来自两个临时表的数据添加到第3个临时表中,然后截断当前FACT TABLE,然后将第3个临时表最终插入FACT表中。

--CLEAR LAST UPDATE TABLE
TRUNCATE TABLE ADM.LastUpdate;

--SET NEW LAST UPDATE TIME
INSERT INTO ADM.LastUpdate(TABLE_NAME, UPDATE_TIME)
VALUES('FactBP', CONVERT(VARCHAR, GETDATE(), 100)+' (CST)');

--CHECK TO SEE IF TEMP TABLES EXISTS THEN DROP
IF OBJECT_ID('tempdb.dbo.#TEMP_CARTON', 'U') IS NOT NULL
    DROP TABLE #TEMP_CARTON;

IF OBJECT_ID('tempdb.dbo.#TEMP_ORDER', 'U') IS NOT NULL
    DROP TABLE #TEMP_ORDER;

--CREATE TEMP TABLES
SELECT *
INTO #TEMP_CARTON
FROM [dbo].[FACT_CARTON_V];

SELECT *
INTO #TEMP_ORDER
FROM [dbo].[FACT_ORDER_V];

--CHECK TO SEE IF DATA EXISTS IN #TEMP_CARTON AND #TEMP_ORDER
IF EXISTS(SELECT * FROM #TEMP_CARTON)
    AND EXISTS(SELECT * FROM #TEMP_ORDER)

--CODE HERE joins the data from #TEMP_CARTON and #TEMP ORDER and puts it into a 3rd temp table #TEMP_FACT.


--CLEAR ALL DATA FROM FACTBP
TRUNCATE TABLE dbo.FactBP;

--INSERT DATA FROM TEMP TABLE TO FACTBP
INSERT INTO dbo.FactBP
SELECT 
[SOURCE]
      ,[DC_ORDER_NUMBER]
      ,[CUSTOMER_PURCHASE_ORDER_ID]
      ,[BILL_TO]
      ,[CUSTOMER_MASTER_RECORD_TYPE]
      ,[SHIP_TO]
      ,[CUSTOMER_NAME]
      ,[SALES_ORDER]
      ,[ORDER_CARRIER]
      ,[CARRIER_SERVICE_ID]
      ,[CREATE_DATE]
      ,[CREATE_TIME]
      ,[ALLOCATION_DATE]
      ,[REQUESTED_SHIP_DATE]
      ,[ADJ_REQ_SHIP]
      ,[CANCEL_DATE]
      ,[DISPATCH_DATE]
      ,[RELEASED_DATE]
      ,[RELEASED_TIME]
      ,[PRIORITY_ORDER]
      ,[SHIPPING_LOAD_NUMBER]
      ,[ORDER_HDR_STATUS]
      ,[ORDER_STATUS]
      ,[DELIVERY_NUMBER]
      ,[DCMS_ORDER_TYPE]
      ,[ORDER_TYPE]
      ,[MATERIAL]
      ,[QUALITY]
      ,[MERCHANDISE_SIZE_1]
      ,[SPECIAL_PROCESS_CODE_1]
      ,[SPECIAL_PROCESS_CODE_2]
      ,[SPECIAL_PROCESS_CODE_3]
      ,[DIVISION]
      ,[DIVISION_DESC]
      ,[ORDER_QTY]
      ,[ORDER_SELECTED_QTY]
      ,[CARTON_PARCEL_ID]
      ,[CARTON_ID]
      ,[SHIP_DATE]
      ,[SHIP_TIME]
      ,[PACKED_DATE]
      ,[PACKED_TIME]
      ,[ADJ_PACKED_DATE]
      ,[FULL_CASE_PULL_STATUS]
      ,[CARRIER_ID]
      ,[TRAILER_ID]
      ,[WAVE_NUMBER]
      ,[DISPATCH_RELEASE_PRIORITY]
      ,[CARTON_TOTE_COUNT]
      ,[PICK_PACK_METHOD]
      ,[RELEASED_QTY]
      ,[SHIP_QTY]
      ,[MERCHANDISE_STYLE]
      ,[PICK_WAREHOUSE]
      ,[PICK_AREA]
      ,[PICK_ZONE]
      ,[PICK_AISLE]
      ,EST_DEL_DATE
FROM #TEMP_FACT;

当前,由于我已将last_updated列添加到FACT TABLE中并创建了一个触发器,因此实际上我没有通过存储过程传递任何值,因此会出现错误

  

对象或列名称丢失或为空。

我不确定应该在哪里传递LAST_UPDATED列的任何值。

这是我为更新last_updated列而创建的触发器:

CREATE TRIGGER last_updated
ON dbo.factbp
AFTER UPDATE 
AS
    UPDATE dbo.factbp
    SET last_updated = GETDATE()
    FROM Inserted i
    WHERE dbo.factbp.id = i.id

2 个答案:

答案 0 :(得分:0)

我要尝试的第一件事是在两个临时表#TEMP_CARTON和#TEMP_ORDER上创建主键,并使用intersect命令获取两个表共有的行:

select * from  #TEMP_CARTON
intersect
SELECT * FROM #TEMP_ORDER

答案 1 :(得分:0)

找出答案。我只需要在插入过程中为last_updated值添加“ null”,然后触发器便会自行添加时间戳。