【问题标题】:How can i handle Insert from select statement using trigger in sqlserver如何使用 sql server 中的触发器从 select 语句中处理 Insert
【发布时间】: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


【解决方案1】:

您可以使用 after insert 触发器在每次插入后更新计数。

【讨论】:

  • 算什么? OP没有提到任何关于计数的事情。你能解释一下这是如何远程尝试回答原始问题的吗?
【解决方案2】:

你需要一个触发器吗?是否需要实时从表中复制新行?

触发器会杀死表的插入性能。

考虑在源表中添加一列 DateLastCopied,然后每分钟一次

declare @now as datetime= getdate()

update sourcetable set DateLastCopied=@now where DateLastCopied is null

insert into targetTable(..)
select ...
FROM sourcetable where DateLastCopied=@now 

【讨论】:

  • 这会自动完成吗?我正在使用 sqlserver express
  • 我需要触发器的唯一原因是自动化流程
猜你喜欢
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多