0

假设我有一个Managers包含字段IdName. 还有另一个Accounts包含字段Id和的表Name。这两个表的关系在一个多对多表中定义,该表具有和ManagedAccounts的复合键。因此,您可以在某个帐户上拥有多个经理,但不能多次在该帐户上拥有同一个经理。ManagerIdAccountId

现在,我有一个名为 MergeAccounts 的存储过程,它接受一个 Manager Id 和一个以逗号分隔的 varchar 形式的 Manager Id 列表。它目前看起来很像这样:

create procedure MergeAccounts @managerId nvarchar(12), @mergedManagers nvarchar(max) as declare @reassignment nvarchar(max)

set @reassignment='update ManagedAccounts set ManagerId='+@managerId+' where ManagerId in ('+@mergedManagers+')'

exec sp_executesql @reassignment

由于两个经理可能在同一个帐户上,它会给我一个错误,说我违反了我在该表上的复合键。我如何需要构造我的代码以简单地删除任何冗余行而不考虑顺序?

4

1 回答 1

1

更改您的动态 SQL 以首先删除任何潜在的冲突。然后进行更新。将其全部包装在事务中。

(顺便说一句,我会通过创建一个表值函数来完全避免使用动态 SQL,该函数从逗号分隔的列表中返回一个表......这非常有用,如果你用谷歌搜索它,你可能会找到一个已经写好的函数)

set @reassignment='
BEGIN TRAN;

BEGIN TRY
    DELETE  m1
    FROM    ManagedAccounts m1
            JOIN ManagedAccounts m2 ON m1.AccountId = m2.AccountId
    WHERE   m2.ManagerId = ' + @managerId + '
            AND m1.ManagerId IN (' + @mergedAccounts + ')

    UPDATE ManagedAccounts SET ManagerId=' + @managerId + ' WHERE ManagerId IN (' + @mergedManagers + ')
    COMMIT;
END TRY
BEGIN CATCH
    ROLLBACK;
END CATCH;';
于 2013-08-29T18:37:54.083 回答