Sql server 子查询返回了多个值。关于mssql2005触发器
一个非常简单的FOR INSERT触发器不断返回错误,子查询返回的值超过1。。一次插入多行时。当我使用如下语句将行插入表SOA.dbo.photos\u TEST时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语
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