Sql server 2008 SQL Server 2008::子查询返回了多个值。当子查询在=、!=、

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 /*****

我在Userinformation表上有[ReconcileUserInformation Computed]触发器

Userinformation表包含以下行 [ID]、[CompanyID]、[Status]、[FirstName]、[LastName]

UserinformationComputed表包含以下行 [id]、[CompanyID]、[law_id]、[Status]、[FirstName]、[LastName]

下面是我的扳机

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)