Sql 对多行使用“合并到”

Sql 对多行使用“合并到”,sql,sql-server,merge,Sql,Sql Server,Merge,我正在尝试创建一个存储过程,它将更新某个表,并使用INT列表。相同的逻辑用于单个更新,但对于这一个表,需要更新多行 但是,我遇到了以下错误: 子查询返回了多个值。当子查询后跟=、!=、=或子查询用作表达式时,这是不允许的 有没有办法让这个合并可以处理多行?还是我需要完全改变逻辑 ALTER PROCEDURE [dbo].[P_ClientBalanceDetails_ExecuteComplex_RefreshFromClawbacks] @ID AS dbo.IntLis

我正在尝试创建一个存储过程,它将更新某个表,并使用INT列表。相同的逻辑用于单个更新,但对于这一个表,需要更新多行

但是,我遇到了以下错误: 子查询返回了多个值。当子查询后跟=、!=、=或子查询用作表达式时,这是不允许的

有没有办法让这个合并可以处理多行?还是我需要完全改变逻辑

ALTER PROCEDURE [dbo].[P_ClientBalanceDetails_ExecuteComplex_RefreshFromClawbacks]      
    @ID AS dbo.IntList READONLY,
    @WorkflowInstanceID int null,
    @AdjustmentFileID int null, 
    @PeriodID int null

AS
BEGIN

SET NOCOUNT ON;

--AGENTS
MERGE INTO ClientBalanceDetails AS TARGET
USING (
    SELECT
        Clawbacks.ID,
        Clawbacks.ClientBalanceID,
        Clawbacks.AgentClientBalanceDetailID,       
        Clawbacks.ValueDate,
        Clawbacks.ClientID,
        Clawbacks.Amount,
        Clawbacks.Reason,
        Clawbacks.ConfirmationStatus,
        Clawbacks.UnderProrationReview,
        Clawbacks.CreatedBy,
        Clawbacks.CreatedDate,
        Clawbacks.UpdatedBy,
        Clawbacks.UpdatedDate,
        Clawbacks.DeletedBy,
        Clawbacks.DeletedDate,
        Clawbacks.PostBillingDisputeID,
        T05_Periods.FirstDay FirstDay           

    FROM 
        Clawbacks WITH (NOLOCK)             
        INNER JOIN ClientBalances WITH (NOLOCK) ON Clawbacks.ClientBalanceID = ClientBalances.ID                             
        INNER JOIN T05_Periods WITH (NOLOCK) ON ClientBalances.PeriodID = T05_Periods.ID        

    WHERE                   
        ClientBalances.DeletedDate IS NULL
        AND (@WorkflowInstanceID IS NULL OR Clawbacks.WorkflowInstanceID = @WorkflowInstanceID)
        AND (@AdjustmentFileID IS NULL OR Clawbacks.AdjustmentFileID = @AdjustmentFileID)
        AND (@PeriodID IS NULL OR T05_Periods.ID = @PeriodID)
        AND (Clawbacks.ID IN (SELECT ID FROM @ID))
        AND (Clawbacks.ConfirmationStatus IN (@ConfirmedStatus, @UnConfirmedStatus, @RejectedStatus) )
        AND (Clawbacks.UnderProrationReview IS NULL OR Clawbacks.UnderProrationReview = 0)              

) AS SOURCE
--Insert new compensations
ON SOURCE.AgentClientBalanceDetailID = TARGET.ID 

select语句返回多条具有相同源的记录。AgentClientBalanceDetailID。如果源记录是重复的,则添加DISTINCT关键字可以解决此问题


如果具有相同AgentClientBalanceDetailID的记录甚至有一列不同,则您的逻辑有缺陷,数据库将不允许合并。之所以这样做,是因为无论记录的顺序如何,SQL都必须始终保持一致。同一个键(AgentClientBalanceDetailID)的列值不同,这意味着您将根据选择结果集中记录的顺序获得不同的更新结果。

我在这里警告使用
NOLOCK
,因为您可能会得到脏读,因此,dirty insertsI也会警告不要使用
MERGE
,尤其是当模式只是为了更新时。还有什么建议呢?对于更新行,最直接的方法是使用update语句。为什么不直接使用另一个表值参数的内部联接,而不是使用IN?