Sql server 2008 SQL Server 2008::子查询返回了多个值。当子查询在=、!=、
我在Userinformation表上有[ReconcileUserInformation Computed]触发器 Userinformation表包含以下行 [ID]、[CompanyID]、[Status]、[FirstName]、[LastName] UserinformationComputed表包含以下行 [id]、[CompanyID]、[law_id]、[Status]、[FirstName]、[LastName] 下面是我的扳机Sql server 2008 SQL Server 2008::子查询返回了多个值。当子查询在=、!=、,sql-server-2008,tsql,stored-procedures,triggers,Sql Server 2008,Tsql,Stored Procedures,Triggers,我在Userinformation表上有[ReconcileUserInformation Computed]触发器 Userinformation表包含以下行 [ID]、[CompanyID]、[Status]、[FirstName]、[LastName] UserinformationComputed表包含以下行 [id]、[CompanyID]、[law_id]、[Status]、[FirstName]、[LastName] 下面是我的扳机 USE [einvoice] GO /*****
USE [einvoice]
GO
/****** Object: Trigger [dbo].[ReconcileUserInformationComputed] Script Date: 08/27/2014 10:53:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[ReconcileUserInformationComputed] ON [dbo].[UserInformation] AFTER INSERT,DELETE,UPDATE
AS
IF @@ROWCOUNT = 0 -- exit trigger when zero records affected
BEGIN
RETURN
END
SET NOCOUNT ON;
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
IF EXISTS (SELECT * FROM DELETED)
BEGIN
--UPDATE
UPDATE [dbo].[UserInformationComputed]
SET -- use new values from inserted
CompanyID = (SELECT CompanyID from inserted),
law_id = (SELECT ID FROM inserted),
Status = (SELECT Status FROM inserted),
FirstName = (SELECT FirstName FROM inserted),
LastName = (SELECT LastName FROM inserted),
WHERE -- use original values from deleted
law_id = (SELECT ID FROM deleted)
END
ELSE
BEGIN
--INSERT
INSERT INTO [dbo].[UserInformationComputed] (CompanyID,law_id,Status,FirstName,LastName)
SELECT CompanyID,id,Status,FirstName,LastName) FROM inserted
END
END
ELSE IF EXISTS(SELECT * FROM DELETED)
BEGIN
--DELETE
DELETE FROM [dbo].[UserInformationComputed]
WHERE law_id = (SELECT id FROM deleted)
END
当尝试更新多个用户的用户信息时
低于误差
Msg 512, Level 16, State 1, Procedure ReconcileUserInformationComputed, Line 16
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
有谁能帮助我修复处理更新多条记录的过程吗?请注意,更新或删除可能会影响多条记录,您的触发器必须同时处理这些记录,在这种情况下,插入或删除的表将有多条记录 您必须在DML中使用联接。大概是这样的:
UPDATE [dbo].[UserInformationComputed]
SET
CompanyID = inserted.CompanyID,
law_id = inserted.ID,
Status = inserted.Status,
FirstName = inserted.FirstName,
LastName = inserted.LastName
from inserted
WHERE
UserInformationComputed.law_id = inserted.ID
我还没有完全理解您的更新逻辑,所以您必须修改我的代码
在DELETE命令中,您可能只需将=更改为:
DELETE FROM [dbo].[UserInformationComputed]
WHERE law_id in (SELECT id FROM deleted)
看看这个:
不要将=用于多结果子查询。在…`中使用。像插入的SELECT CompanyID中的CompanyID一样?你太接近了。。。1个值=1个值或值列表中的1个值…从不1个值=值列表是否插入了SELECT*中的公司ID?我是sql方面的新手,所以如果这一条不正确,请不要误解我的意思。如果我按照你的建议对UserInformationComputed触发器进行了更改,它工作了,但对triiger ReconcileCrossRefComputedupdated不起作用。在我的回答中,子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。@RanPaul我在ReconcileCrossRefComputed过程中看不到任何子查询,因此这是一个非常奇怪的错误。完整的错误消息告诉触发器名称和行号,对吗?是否真的是ReconcileCrossRef计算出了抛出错误的人?在哪一行?Msg 512,16级,状态1,过程ReconcileCrossRefComputed,第13行是UPDATE[dbo].[CrossRefComputed]@RanPaul Oh man!我很难过。这对我来说毫无意义;此触发器中没有子查询。你确定你真的在执行你在问题中粘贴的代码吗?
DELETE FROM [dbo].[UserInformationComputed]
WHERE law_id in (SELECT id FROM deleted)