手动执行而不是通过触发器执行时,存储过程可以工作

时间:2018-08-20 16:50:28

标签: sql-server

所以我用SQL创建了一个存储过程,它执行4件事

  1. 在客户订单表中创建订单
  2. 在“客户订单行”表上创建订单行
  3. 通过获取当前值并添加1来更新自动编号列
  4. 使用客户订单ID更新采购订单
  5. 发送电子邮件以通知订单已创建。

如果我分别执行每个部分或通过发送命令EXEC dbo.POIMPORT_UK @PO_NUM = 123456手动执行整个存储过程,那就太棒了

但是当我创建一个PO并触发插入时,查询1,3,4,5起作用,但是2出于某种原因却没有。我只有手动启动该程序才能使用它。有什么想法吗?

USE [RIPTST]
GO
/****** Object:  StoredProcedure [dbo].[POIMPORT_UK]    Script Date: 8/20/2018 11:21:23 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[POIMPORT_UK]
@PO_NUM NVARCHAR(15)
AS


SET NOCOUNT ON
--For synchronization machine id placement

--Query 1
INSERT INTO CUSTOMER_ORDER(ID, CUSTOMER_ID, SITE_ID, SELL_RATE, BUY_RATE,
TERMS_NET_TYPE, TERMS_DISC_TYPE, FREIGHT_TERMS, BACK_ORDER, STATUS,
POSTING_CANDIDATE, MARKED_FOR_PURGE, CURRENCY_ID, CUSTOMER_PO_REF,   
WAREHOUSE_ID, DESIRED_SHIP_DATE) SELECT (SELECT Next_number FROM 
NEXT_NUMBER_GEN where rowid = 
'72'),'ABECO','101RIPUS','1.0','1.0','A','A','P','N','F','N','N','(USD) 
$',ID,'CROM',Getdate() FROM PURCHASE_ORDER WHERE ID = @PO_NUM 

--Query 2
INSERT INTO CUST_ORDER_LINE   
(CUST_ORDER_ID,LINE_NO,PART_ID,LINE_STATUS,ORDER_QTY,USER_ORDER_QTY,
SELLING_UM,UNIT_PRICE,SITE_ID,MISC_REFERENCE,PRODUCT_CODE,COMMODITY_CODE,
DRAWING_ID,DRAWING_REV_NO,MAT_GL_ACCT_ID,LAB_GL_ACCT_ID,BUR_GL_ACCT_ID,
SER_GL_ACCT_ID,GL_REVENUE_ACCT_ID,TOTAL_AMT_ORDERED,ENTERED_BY,WAREHOUSE_ID) 
SELECT(select id from customer_order where CUSTOMER_PO_REF = @PO_NUM),
LINE_NO,PURC_ORDER_LINE.PART_ID,'A',ORDER_QTY,USER_ORDER_QTY,
PURCHASE_UM,PURC_ORDER_LINE.UNIT_PRICE,'101RIPUS',PART.DESCRIPTION,
PART.PRODUCT_CODE,PART.COMMODITY_CODE,PART.DRAWING_ID,PART.DRAWING_REV_NO,
PART_SITE.MAT_GL_ACCT_ID,PART_SITE.LAB_GL_ACCT_ID,PART_SITE.BUR_GL_ACCT_ID,
PART_SITE.SER_GL_ACCT_ID,
(SELECT REV_GL_ACCT_ID FROM PRODUCT WHERE CODE = PART.PRODUCT_CODE),
USER_ORDER_QTY*PURC_ORDER_LINE.UNIT_PRICE,'SYSADM',
PART_SITE.PRIMARY_WHS_ID From PURC_ORDER_LINE 
Inner Join PART On PART.ID = PURC_ORDER_LINE.PART_ID 
Inner Join PART_SITE On PART_SITE.PART_ID = PART.ID 
WHERE PURC_ORDER_ID = @PO_NUM AND PART_SITE.sITE_ID = '101RIPUS'




--Query 3
Update NEXT_NUMBER_GEN Set Next_number = Next_number + 1 where rowid = '72'

--Query 4
Update PURCHASE_ORDER Set SALES_ORDER_ID = (select id from customer_order where CUSTOMER_PO_REF = @PO_NUM) where id = @PO_NUM

--Query 5
Declare @PO NVARCHAR(15) = @PO_NUM
Declare @CO NVARCHAR(15) = (select id from customer_order where CUSTOMER_PO_REF = @PO)
Declare @MYBODY VARCHAR(MAX) = 'Hello Test CSR,
A new internal order has been created for Ripley UK.

Test US Customer Order Number: ' + @CO +
'

Test UK Purchase Order Number: ' + @PO
EXEC msdb.dbo.sp_send_dbmail @profile_name='office365',
@recipients='test@test.com',
@subject='Test UK - Internal Order',
@body= @MYBODY

  SET NOCOUNT OFF

Insert Trigger


USE [RIPTST]
GO
/****** Object:  Trigger [dbo].[INSERT_PURCHASE_ORDER]    Script Date: 8/20/2018 1:42:15 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[INSERT_PURCHASE_ORDER] ON [dbo].[PURCHASE_ORDER] FOR INSERT AS 
DECLARE 
 @nRcd INT, 
 @ID NVARCHAR(15), 
 @VENDOR_ID NVARCHAR(15), 
 @SITE_ID NVARCHAR(15), 
 @STATUS NCHAR, 
 @TOTAL_AMT_ORDERED DEC(15,2), 
 @TOTAL_AMT_RECVD DEC(15,2), 
 @SELL_RATE DEC(17,8), 
 @nCurrDigits INT, 
 @sEntityID                  NVARCHAR(15), 
 @ORDER_DATE DATETIME 
SELECT @nRcd = 0 
SET NOCOUNT ON 
DECLARE PURCHASE_ORDER_INS CURSOR LOCAL FOR SELECT ID, VENDOR_ID, STATUS, TOTAL_AMT_ORDERED, TOTAL_AMT_RECVD, SELL_RATE, ORDER_DATE, SITE_ID FROM INSERTED 
OPEN PURCHASE_ORDER_INS 
FETCH PURCHASE_ORDER_INS INTO @ID, @VENDOR_ID, @STATUS, @TOTAL_AMT_ORDERED, @TOTAL_AMT_RECVD, @SELL_RATE, @ORDER_DATE, @SITE_ID 
WHILE (@nRcd = 0 and @@FETCH_STATUS <> -1) 
BEGIN 
 EXEC EXE_DETECT_EVENT 'P', @ID, NULL, NULL, 'I' 
 If @TOTAL_AMT_ORDERED + @TOTAL_AMT_RECVD != 0 
 SELECT @nRcd = 30881 
 If @nRcd = 0 And (@STATUS = 'R' Or @STATUS = 'F') And @TOTAL_AMT_ORDERED > @TOTAL_AMT_RECVD 
 BEGIN 
  select @nCurrDigits = c.i_curr_digits, @sEntityID = s.entity_id from CURRENCY c, ACCOUNTING_ENTITY ae, SITE s where s.id = @SITE_ID and ae.id = s.entity_id and ae.functional_currency_id = c.id 
  IF NOT EXISTS ( SELECT VENDOR_ID FROM VENDOR_ENTITY WHERE vendor_id = @VENDOR_ID and entity_id = @sEntityID ) 
    INSERT INTO VENDOR_ENTITY ( VENDOR_ID, ENTITY_ID ) VALUES ( @VENDOR_ID, @sEntityID ) 
  update VENDOR_ENTITY set 
  total_open_orders = total_open_orders + ROUND((@TOTAL_AMT_ORDERED - @TOTAL_AMT_RECVD) * @SELL_RATE, @nCurrDigits), 
  open_order_count = open_order_count + 1 
  where vendor_id = @VENDOR_ID and entity_id = @sEntityID 
 END 
 UPDATE VENDOR set last_order_date = @ORDER_DATE where id = @VENDOR_ID 
 FETCH PURCHASE_ORDER_INS INTO @ID, @VENDOR_ID, @STATUS, @TOTAL_AMT_ORDERED, @TOTAL_AMT_RECVD, @SELL_RATE, @ORDER_DATE, @SITE_ID 
END 
BEGIN
IF @VENDOR_ID = 'RIP01' AND @SITE_ID = '111RIPUK'
EXEC dbo.POIMPORT_UK @PO_NUM = @ID
END
DEALLOCATE PURCHASE_ORDER_INS 
IF (@nRcd <> 0) RAISERROR('VMFG-%d error in trigger INSERT_PURCHASE_ORDER', 16, -1, @nRcd) 
IF (@nRcd <> 0 Or @@ERROR <> 0) ROLLBACK TRANSACTION 

0 个答案:

没有答案