【问题标题】:Insert Multiple Rows in SQL SERVER using a Trigger使用触发器在 SQL SERVER 中插入多行
【发布时间】:2015-01-05 05:48:25
【问题描述】:

我需要使用触发器将多行插入另一个表,但它只插入最后一条记录 我检查了stackoverflow中的其他一些帖子,但没有找到答案,

这是我的触发器

IF(@TNAEventID IN(1,2,3))       
BEGIN
    INSERT INTO [Biostar].Cen.WentOutLog    (AutoID, nUserID, nOutDateTime,nOutTNAEvent ,nReaderID) values  (@AutoID,@UseID, @DateTime,@TNAEventID, @ReaderID )
END
else IF(@TNAEventID=0)      
BEGIN
    
    UPDATE Cen.WentOutLog Set  nINDateTime =@DateTime,nInTNAEvent = @TNAEventID  Where AutoID = (Select  top (1) AutoID from Cen.WentOutLog where nINDateTime is null AND  nOutDateTime<@DateTime AND  nUserID=@UseID order by nOutDateTime desc)
END
else
begin
    ....
end

提前致谢。

【问题讨论】:

  • 由于您正在为 INSERTED 表中的变量分配值,因此它只会保留插入的最后一行。要插入所有行,您只需简单地使用: INSERT INTO SELECT FROM INSERTED
  • 同样的事情可以用 UPDATE 来处理多行。您需要使用带有JOIN子句的UPDATE语句,您可以在网上找到大量示例。
  • @Vishal 我在整个互联网上进行了搜索,但我不明白那些你能根据上面的查询为我创建那个代码吗?

标签: sql-server sql-server-2008 triggers


【解决方案1】:

您可以试试下面的代码,插入代码很容易使用。

您可能需要更改 UPDATE 语句,因为我不知道是什么 你的数据:

INSERT INTO [Biostar].[Cen].[WentOutLog]
    ([AutoID], [nUserID], [nOutDateTime], [nOutTNAEvent], [nReaderID])
SELECT  [AutoID], [nUserID], [nOutDateTime], [nOutTNAEvent], [nReaderID]
FROM    INSERTED
WHERE   TNAEventID IN (1, 2, 3)

UPDATE  W
FROM    [Cen].[WentOutLog]
SET     W.[nINDateTime] = I.[DateTime],
        W.[nInTNAEvent] = I.[TNAEventID]
INNER JOIN INSERTED I ON W.[AutoID] = I.[AutoID]
WHERE   I.[TNAEventID] = 0
AND     W.[nINDateTime] IS NULL
AND     W.[nOutDateTime] < I.[DateTime]
AND     W.[nUserID] = I.[UserID]

【讨论】:

  • INSERT 工作正常,但我在更新时遇到问题,我在 Update 的 where 条件中有子查询,我使用了 select top(1) 但它仍然说“子查询返回超过 1 个值”跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 2016-12-22
相关资源
最近更新 更多