Sql server MSSQL2016更新触发器,根据位列的总和在其他表中插入记录
我正在尝试自动化我们的订单状态更新系统。以下是我们现有的流程: 订单通过FTP文件作为一个订单进入我们的系统,并被拆分为2个或多个订单插入到SplitOrdersHeader_tb中 产生的多个订单从SplitOrders表标题和明细发送到ERP系统 ERP系统为插入到OrderConfirmationHeader_tb和detail表中的每个订单生成订单确认 收到所有拆分订单确认后,需要更新原始单订单状态 以下是相关表格:Sql server MSSQL2016更新触发器,根据位列的总和在其他表中插入记录,sql-server,triggers,sql-server-2016,Sql Server,Triggers,Sql Server 2016,我正在尝试自动化我们的订单状态更新系统。以下是我们现有的流程: 订单通过FTP文件作为一个订单进入我们的系统,并被拆分为2个或多个订单插入到SplitOrdersHeader_tb中 产生的多个订单从SplitOrders表标题和明细发送到ERP系统 ERP系统为插入到OrderConfirmationHeader_tb和detail表中的每个订单生成订单确认 收到所有拆分订单确认后,需要更新原始单订单状态 以下是相关表格: CREATE TABLE SplitOrdersHeader_tb(
CREATE TABLE SplitOrdersHeader_tb(
OriginalCustomerPONumber varchar(20),
NewCustomerPONumber varchar(20),
Company varchar(2),
CustomerNumber varchar(10),
OrderProcessed bit DEFAULT 0,
OrderMoved bit DEFAULT 0,
OrderConfirmationReceived bit DEFAULT 0
)
CREATE TABLE OrderConfirmationHeader_tb(
MasterOrderNumber varchar(20),
CustomerPONumber varchar(20),
Company varchar(2),
CustomerNumber varchar(10)
)
CREATE TABLE UpdateOtherSystem_tb(
OriginalCustomerPONumber varchar(20)
)
我在OrderConfirmationHeader_tb上有一个触发器,在加载订单确认后更新每个拆分订单的状态:
CREATE TRIGGER dbo.INSERT_Update_SplitOrderConfirmations_tg
ON dbo.OrderConfirmationHeader_tb
AFTER INSERT
AS
SET NOCOUNT ON
BEGIN
UPDATE SOH
SET SOH.OrderConfirmationReceived = 1,
SOH.MasterOrderNumber = LTRIM(RTRIM(I.MasterOrderNumber))
FROM OrderSplitting.SplitOrdersHeader_tb SOH
INNER JOIN inserted I ON SOH.CustomerNumber = I.Customer
AND SOH.NewCustomerPONumber = I.Reference
AND SOH.Company = I.Company
AND SOH.OrderProcessed = 1
AND SOH.OrderMoved = 1
END
我想做的是在SplitOrdersHeader_tb上创建一个更新触发器,它将:
-从原始CustomerPONumber中计算拆分订单的数量
-OrderConfirmationReceived值的总数
-如果COUNT=SUM,则在UpdateOtherSystem_tb中插入一条新记录,前提是UpdateOtherSystem_tb中不存在MasterOrderNumber
我有这个,但感觉太笨重了:
CREATE TRIGGER OrderSplitting.UPDATE_Update_WCO_Status_tg
ON OrderSplitting.SplitOrdersHeader_tb
AFTER UPDATE AS
SET NOCOUNT ON
BEGIN
DECLARE @NEW_CUSTOMER_PO_NUMBER varchar(255),
@ORIGINAL_CUSTOMER_PO_NUMBER varchar(255),
@COUNT_OF_ORDER_HEADERS int,
@TOTAL_CONFIRMED_ORDERS int
SELECT @NEW_CUSTOMER_PO_NUMBER = NewCustomerPONumber
FROM inserted
SELECT @ORIGINAL_CUSTOMER_PO_NUMBER = OriginalCustomerPONumber,
@COUNT_OF_ORDER_HEADERS = COUNT(*),
@TOTAL_CONFIRMED_ORDERS = SUM(CAST(OrderConfirmationReceived as int))
FROM OrderSplitting.SplitOrdersHeader_tb
WHERE OriginalCustomerPONumber IN (SELECT OriginalCustomerPONumber
FROM OrderSplitting.SplitOrdersHeader_tb
WHERE NewCustomerPONumber = @NEW_CUSTOMER_PO_NUMBER)
GROUP BY OriginalCustomerPONumber
IF @COUNT_OF_ORDER_HEADERS = @TOTAL_CONFIRMED_ORDERS
BEGIN
BEGIN TRY
INSERT INTO OrderSplitting.UpdateOtherSystem_tb(OriginalCustomerPONumber)
VALUES(@ORIGINAL_CUSTOMER_PO_NUMBER)
END TRY
BEGIN CATCH
DECLARE @ERROR_MESSAGE varchar(MAX)
SET @ERROR_MESSAGE = ERROR_MESSAGE()
EXEC msdb..sp_send_dbmail
@recipients = <app_support>,
@subject = 'Update Trigger Error',
@body = @ERROR_MESSAGE
END CATCH
END
END
我想我有些东西,但想得到一些额外的反馈,请:
CREATE TRIGGER OrderSplitting.UPDATE_Update_WCO_Status_tg
ON OrderSplitting.SplitOrdersHeader_tb
AFTER UPDATE AS
SET NOCOUNT ON
BEGIN TRY
INSERT INTO OrderSplitting.UpdateOtherSystem_tb(OriginalCustomerPONumber)
SELECT SOH.OriginalCustomerPONumber
FROM OrderSplitting.SplitOrdersHeader_tb SOH
INNER JOIN inserted I ON SOH.OriginalCustomerPONumber = I.OriginalCustomerPONumber
LEFT OUTER JOIN OrderSplitting.UpdateOtherSystem_tb UOS ON SOH.OriginalCustomerPONumber = UOS.OriginalCustomerPONumber
WHERE UOS.OriginalCustomerPONumber IS NULL
GROUP BY SOH.OriginalCustomerPONumber
HAVING COUNT(SOH.OriginalCustomerPONumber) = SUM(CAST(SOH.OrderConfirmationReceived as int))
END TRY
BEGIN CATCH
DECLARE @ERROR_MESSAGE varchar(MAX)
SET @ERROR_MESSAGE = ERROR_MESSAGE()
EXEC msdb..sp_send_dbmail
@recipients = <app_support>,
@subject = 'Update Trigger Error',
@body = @ERROR_MESSAGE
END CATCH
当前触发器将只处理单行更新,即:inserted可以包含多行,并且从inserted中选择@NEW\u CUSTOMER\u PO\u NUMBER=NewCustomerPONumber只处理其中一行。如果两行或更多行同时更新会发生什么?这是我之前遇到的另一个问题,但我认为我只是看到了一些东西。既然有人也指出了这一点,我真的不知道该如何进行。