Sql server 子查询返回了多个值。关于mssql2005触发器

Sql server 子查询返回了多个值。关于mssql2005触发器,sql-server,triggers,Sql Server,Triggers,一个非常简单的FOR INSERT触发器不断返回错误,子查询返回的值超过1。。一次插入多行时。当我使用如下语句将行插入表SOA.dbo.photos\u TEST时 INSERT INTO SOA.dbo.photos_TEST (id,length,picture,type,name,value,arrivaldatetime) SELECT VW.id, ... , FROM SOA.dbo.AeosPhotoTEST_VW vw WHERE ... 插入失败。但是,当我向SELECT语

一个非常简单的FOR INSERT触发器不断返回错误,子查询返回的值超过1。。一次插入多行时。当我使用如下语句将行插入表SOA.dbo.photos\u TEST时

INSERT INTO SOA.dbo.photos_TEST (id,length,picture,type,name,value,arrivaldatetime)
SELECT  VW.id, ... ,
FROM SOA.dbo.AeosPhotoTEST_VW vw
WHERE ...
插入失败。但是,当我向SELECT语句添加TOP1时,触发器不会报告错误。因此,触发器中的SELECT FROM INSERTED语句可能会返回插入表中的所有行。我应该在触发器中迭代插入的所有行吗?欢迎提出任何建议

触发器的当前代码为

SELECT @VALUE = (SELECT VALUE FROM INSERTED)

SET NOCOUNT ON

BEGIN
    DELETE FROM SOA.dbo.photos_TEST 
    WHERE   (value = @VALUE ) 
    AND (arrivaldatetime < (SELECT arrivaldatetime 
                FROM INSERTED
                WHERE value = @VALUE))
END

将T-SQL触发器删除逻辑修改为以下内容:

DELETE A
FROM SOA.dbo.photos_TEST A
   INNER JOIN INSERTED B on
       A.VALUE = B.VALUE
WHERE A.arrivaldatetime < B.arrivaldatetime 

我假设您需要删除所有旧值。调整你的触发器如下所示

触发


您好,John,按照您的建议更改触发器仍然会返回子查询返回的值超过1。当。。。当添加超过1行时。@pcvnes,它不应该。你确定你换了扳机吗?你能发布更新后的脚本吗?嗨,John,再次尝试了你的解决方案。这一次是剪切和粘贴,它确实有效。谢谢现在可以开始解决my AFTER INSERT中的下一个问题,更新触发器为请参阅。。是什么让您的解决方案比Lieven的SQL“更好”?价格便宜吗?@pcvnes:好消息。你的问题的两种解决方案基本上是一样的。不客气,我的朋友。我也知道你的意思。我停止学习的那一天就是我寻找新职业的那一天@约翰,谢谢你的编辑。我仍然对学习新的、更快的做事方式感到兴奋你好,列文,谢谢!这个也行!当您将多行插入到一个表中时,插入的表确实包含多行,并且触发器只执行一次吗?我假设每行更新都会导致一个单独的触发器事件。正确。请记住,SQL Server以集合的形式处理数据,因此,无论要插入的记录数如何,单个Insert语句都会导致给定触发器的一次触发。
  BEGIN 
    DELETE p
    FROM  SOA.dbo.photos_TEST p
          INNER JOIN INSERTED i ON i.Value = p.Value
                                   AND i.ArrivalDateTime > p.ArrivalDateTime
  END