Sql server 在子查询上失败的SQL合并(带临时表)返回了1个以上的值(但我没有在更新中使用子查询..)

Sql server 在子查询上失败的SQL合并(带临时表)返回了1个以上的值(但我没有在更新中使用子查询..),sql-server,sql-update,subquery,temp-tables,sql-merge,Sql Server,Sql Update,Subquery,Temp Tables,Sql Merge,我希望有人能帮我摆脱这种单调乏味的生活 正如标题所示,我有一个临时表(在select语句中动态创建): 。。。如您所见,它在交叉联接中使用子查询 接下来,我尝试使用这个临时表#results用它的值更新相关表。已尝试使用更新: UPDATE a SET a.StatusId = b.StatusId FROM Table_1 a INNER JOIN #results b on (a.ItemId = b.ItemId) 通过合并: MERGE INTO Table_1 a US

我希望有人能帮我摆脱这种单调乏味的生活

正如标题所示,我有一个临时表(在select语句中动态创建):

。。。如您所见,它在交叉联接中使用子查询

接下来,我尝试使用这个临时表#results用它的值更新相关表。已尝试使用更新:

UPDATE a
SET a.StatusId = b.StatusId
FROM Table_1    a
INNER JOIN #results     b on (a.ItemId = b.ItemId)
通过合并:

MERGE INTO Table_1 a
USING #results b
ON (a.ItemId = b.temId)
WHEN MATCHED THEN UPDATE SET a.StatusId = b.StatusId;
但我似乎总是得到一个回应:

Msg 512,级别16,状态1,过程trg_dbo_PBITree_TreeModel_hierarchycalescalescalationhistory_InsertNode, 第7行[批处理开始行11]子查询返回了多个值。这 当子查询在=、!=、=或 当子查询用作表达式时

当我查询有问题的两个表(#results&Table_1)时,它们都有1对1的关系,根本看不到它可能隐藏某种子查询的位置

有谁能快点帮上忙吗?这好像是1-0-1的东西,它在烤我的汉堡

--编辑--

我已经查看了错误消息中提到的触发器,因为有人建议它可能尝试处理单行更新,而不是我正在做的多行更新。对我来说没什么不寻常的

ALTER TRIGGER [dbo].[trg_dbo_PBITree_TreeModel_HierarchicalEscalationHistory_InsertNode] 
ON [dbo].[Table_1]
AFTER UPDATE 
AS
BEGIN
    -- NodeModelInsertOrUpdateTPH
    IF ((select [Item] from inserted) = 'X')
        BEGIN
            UPDATE tx
            SET 
                tx.LastUpdatedBy = i.LastUpdatedBy,
                tx.LastUpdatedAt = i.LastUpdatedAt
            FROM 
                [dbo].[Table_X] tx,
                inserted i
            WHERE
                tx.OtherItemId = i.OtherItemId
        END
END

有人有什么想法吗?

这里的问题是你的触发器。IF语句有一个查询,该查询将返回超过1行,结果就是该消息。您应该使触发器能够容忍多行操作。这是相同的逻辑,但它可以处理任何数量的被更新行

ALTER TRIGGER [dbo].[trg_dbo_PBITree_TreeModel_HierarchicalEscalationHistory_InsertNode] 
ON [dbo].[Table_1]
AFTER UPDATE 
AS
BEGIN
    UPDATE tx
    SET 
        tx.LastUpdatedBy = i.LastUpdatedBy,
        tx.LastUpdatedAt = i.LastUpdatedAt
    FROM 
        [dbo].[Table_X] tx
        join inserted i ON tx.OtherItemId = i.OtherItemId
        where i.Item = 'X'
END

您有一个中断的触发器,该触发器假定插入的
只包含一行,而不是0、1或多行,但是许多行都受到触发触发器的语句的影响。我想我明白了。。。因此,当更新单个值时,触发器是好的,但是一旦您针对一个事务中的多个更新的连接运行触发器,它就会崩溃?我需要检查一下这个触发器,否则就不可能了。。。迭代奇怪。。。我正在查看错误消息中的触发器,它似乎使用“insert”作为表。。。我看不到任何迹象表明它不应该能够处理这个请求,我不认为!?你的IF语句就是问题所在。如果有两行正在更新,触发器将失败,并显示确切的消息。我会改变这一点,而不是if语句,让它成为更新中的where谓词。是的,我认为上面的一个Sean已经击中了要害。。。不知道为什么我没看到?!?!非常感谢!
ALTER TRIGGER [dbo].[trg_dbo_PBITree_TreeModel_HierarchicalEscalationHistory_InsertNode] 
ON [dbo].[Table_1]
AFTER UPDATE 
AS
BEGIN
    UPDATE tx
    SET 
        tx.LastUpdatedBy = i.LastUpdatedBy,
        tx.LastUpdatedAt = i.LastUpdatedAt
    FROM 
        [dbo].[Table_X] tx
        join inserted i ON tx.OtherItemId = i.OtherItemId
        where i.Item = 'X'
END