2

我有一个遗留字段,其中包含一个逗号分隔的用户 ID 列表,我将在某个时候替换它,但现在我只需要维护它,我已经设置了一个触发器,所以当用户被添加到一个组时它坚持它进入列表没问题,但是当用户被删除时,我需要一个触发器将其从列表中删除。我使用了这段代码,当你一次只删除一个成员时它工作得很好,但是我需要让它一次用于多次删除,我通常加入到已删除的表并繁荣,我不在但在这个例如它不会工作。

你能告诉我从触发器上的多个逗号分隔的字符串中删除多个用户 ID 的最佳方法吗?

这是当前的触发器。

DECLARE @MemberID int

SELECT @MemberID = MemberID FROM Deleted 

UPDATE MemberGroups SET MembersList = SUBSTRING(
REVERSE (SUBSTRING (REVERSE (REPLACE(',' + mgs.MembersList + ',', ',' + CAST(@MemberID AS varchar) + ',', ',') ) , 2, 8000) ), 2, 8000)
 FROM MemberGroups mgs
 WHERE ',' + mgs.MembersList + ',' LIKE (',%' + CAST(@MemberID AS Varchar) + '%,')
4

2 回答 2

0

在这种情况下我会做什么:

  1. 将要删除的 ID 列表存储在名为 @todelete 的临时表中。
  2. 声明一个新列表。@newlist varchar(最大值)
  3. 解析原始成员列表,将成员ID一一提取,放入@newlist。但是在插入时确保它不在@todelete 中。
  4. 将原成员列表的内容替换为@newlist 的内容。
于 2012-05-29T03:54:30.517 回答
0

如果您想玩一下 Xml,可以将逗号分隔的值列表转换为 Xml,应用修改,然后重新创建列表。在我的示例中,我将字符串转换为格式良好的 Xml,使用nodesandvalue函数返回行集,加入deleted并保留剩余的成员 ID,使用FOR XML PATH. 这是代码:

--update the groups if the member list contains more then one item
;WITH results(GroupID, MemberID) AS (
SELECT t.GroupID, t.MemberID FROM (
    SELECT GroupID, t.c.value('text()[1]', 'INT') AS MemberID
    FROM (SELECT GroupID, CONVERT(XML, '<ms><m>' + REPLACE(MemberList, ',', '</m><m>') + '</m></ms>') AS ms FROM MemberGroups) x
    CROSS APPLY x.ms.nodes('//m') AS t(c)
    ) t
LEFT JOIN deleted d ON t.MemberID = d.MemberID
WHERE d.MemberID IS NULL 
) UPDATE mg SET
    MemberList = SUBSTRING((SELECT ',' + CONVERT(VARCHAR(10), MemberID) FROM results WHERE GroupID = r.GroupID FOR XML PATH('')), 2, 8000)
FROM MemberGroups mg
INNER JOIN results r ON mg.GroupID = r.GroupID

--update the groups if the member list contains one item only
UPDATE mg SET 
    MemberList = NULL
FROM MemberGroups mg
INNER JOIN deleted d ON mg.MemberList = CONVERT(VARCHAR(10), d.MemberID)

SELECT * FROM MemberGroups
于 2012-05-29T04:34:33.600 回答