【发布时间】:2017-05-25 18:32:18
【问题描述】:
我有以下 TSQL 语句将数据从一个数据库表插入到另一个数据库表,我如何使用触发器来管理它?
源表是[DISCS],目标表是,
[WIBOMH] 是主表,[WIBOMH] 是表头表,[WIBOMD] 是明细表,所以
订单必须先插入[WIITEM],然后创建一个标题[WIBOMH]
我想解雇这个AFTER INSERT。当我将新的DISC 添加到DISC 表中时,我想触发以下插入语句
--插入[WIITEM]表---
INSERT INTO [WIITEM]
([itemId], [descr],[xdesc],[sales] ,[uOfM] ,[poUOfM] ,[uConvFact],[ref],[type],[status],[unitWgt] )
SELECT [itemId], [PURCHASE_DESCRIPTION], [SALES_DESCRIPTION], [sales] ,[uOfM] ,[poUOfM] ,[uConvFact],'TESTING', '2','0',[unitWgt]
FROM [DISCS]
WHERE [itemId] NOT IN (SELECT [itemId] FROM [WIITEM])
AND [makebuy]='Make';
--插入[WIBOMH]表格---
DECLARE @d DATETIME = GETDATE();
INSERT INTO [WIBOMH]
([bomItem], [bomRev], [rollup], [mult], [autoBuild], [assyLead],[revCmnt],[author],[descr],[qPerLead],[lstMainDt],[revDate],[effStartDate],[ovride] )
SELECT DISTINCT [bomitem], 'B', '1', '1', '1', '3','TESTING','USER NAME','TESTING','0', FORMAT(@d, 'yyyy-MM-dd HH\:mm\:ss\.fff', 'en-US') AS 'Format#1',FORMAT(@d, 'yyyyMMdd' , 'en-US') AS 'Format#2',FORMAT(@d, 'yyyyMMdd' , 'en-US') AS 'Format#2','0'
FROM [DISCS]
WHERE [bomitem] IN (SELECT [ItemId] FROM [WIITEM] where type='2')
AND [bomitem] NOT IN (SELECT [bomItem] FROM [WIBOMH]);
-- 插入[WIBOMD] 表中---
INSERT INTO [WIBOMD]
([bomItem], [bomRev], [bomEntry], [partId], [qty],[cmnt],[srcLoc],[dType],[lead],[lineNbr])
SELECT [ItemID], 'B', [bomEntry], [partid], [qty],'TESTING','WSD-DS','0','0', [lineNbr]
FROM [DISCS]
WHERE [ItemID] IN (SELECT [ItemId] FROM [WIITEM] where type='2')
AND [ItemID] NOT IN (SELECT [bomItem] FROM [WIBOMD]);
我试过了
INSERT INTO [MITESTCO].[WIITEM]
([itemId], [descr],[xdesc],[sales] ,[uOfM] ,[poUOfM] ,[uConvFact],[ref],[type],[status])
SELECT
[CALC STOCK PN], [PURCHASE DESCRIPTION], [SALES DESCRIPTION], [CALC STOCK PN] ,'EA' ,'EA' ,'1','SYNC FROM PDM', '2','0'--,[APPROX. WGT.]
FROM inserted
WHERE [MAKE / BUY]='Make' [CALC STOCK PN] NOT IN (SELECT [itemId] FROM [MIITEM] WHERE itemId NOT LIKE '*-CI');
但我明白了
无效对象 [MITESTCO].[WIITEM]
这里我的第一个触发器工作了
create TRIGGER [dbo].[PNSETUP]
ON [dbo].[DISCS]
AFTER insert,UPDATE
AS
BEGIN
IF TRIGGER_NESTLEVEL() > 1
RETURN
SET ANSI_WARNINGS OFF;
INSERT INTO MITESTCO.dbo.WIITEM
([itemId], [descr],[xdesc],[sales] ,[uOfM] ,[poUOfM] ,[uConvFact],[ref],[type],[status])--,[unitWgt]
SELECT [CALC STOCK PN], [PURCHASE DESCRIPTION], [SALES DESCRIPTION], [CALC STOCK PN] ,'EA' ,'EA' ,'1','SYNC FROM PDM', '2','0'--,[APPROX. WGT.]
FROM [DISCS]
WHERE [CALC STOCK PN] NOT IN (SELECT [itemId] FROM MITESTCO.dbo.[WIITEM] WHERE itemId NOT LIKE '*-CI')
AND [MAKE / BUY]='Make';
SET ANSI_WARNINGS ON;
如何将接下来的两个插入选择语句添加到同一个触发器
【问题讨论】:
-
什么动作/事件应该触发什么数据的什么插入?您的问题不清楚。
-
@JenR 我想在 INSERT 之后触发触发器,这是动作/事件的含义吗?
-
就像 - “当某些东西被插入到表 A 中时,我希望 x 发生。” - 在这种情况下,事件是“向表 A 中插入了某些东西”,而“x”是触发器应该执行的操作。
-
您的代码示例与您的问题不一致。仔细查看代码示例中的表名。确保它们是正确的。正如所写的那样,它们只会使问题变得模棱两可和令人困惑,而且绝对不清楚。
-
那么当一行插入到 DISCS 中时,你想插入到所有三个表中吗?您会希望触发器中的所有这三个插入。但是您需要利用插入的虚拟表,以便知道插入了哪些行。如果您需要任何类型的详细帮助,您将需要向我们提供更多详细信息。
标签: sql-server tsql triggers