Sql server 从一个表插入到另一个问题

Sql server 从一个表插入到另一个问题,sql-server,tsql,stored-procedures,sql-insert,primary-key,Sql Server,Tsql,Stored Procedures,Sql Insert,Primary Key,我在尝试使以下存储过程正常工作时遇到问题。我有一个由用户id和组id组成的用户组表。这两个id都设置为主键,不为null。我要做的是将当前在组列表中的所有用户插入到该表中。为了更清楚地说明这一点,我正在尝试做以下工作: 组ID 50、52、53中的用户将其插入组40 当前,存储过程给了我一个主键约束“PK\u user\u groups”。无法在对象中插入重复的键。。。重复的键值是3,40。当我查看user_groups表时,我确实看到了3、40的记录,但是组40还包含用户5、8、10。我希望将

我在尝试使以下存储过程正常工作时遇到问题。我有一个由用户id和组id组成的用户组表。这两个id都设置为主键,不为null。我要做的是将当前在组列表中的所有用户插入到该表中。为了更清楚地说明这一点,我正在尝试做以下工作:

组ID 50、52、53中的用户将其插入组40

当前,存储过程给了我一个主键约束“PK\u user\u groups”。无法在对象中插入重复的键。。。重复的键值是3,40。当我查看user_groups表时,我确实看到了3、40的记录,但是组40还包含用户5、8、10。我希望将用户5、8、10添加到组40中,但由于用户3已经有记录,所以添加失败

以下是我的存储过程:

@targetGroupId int,
@groupList nvarchar(max)

DECLARE @list TABLE (groupId int);
    
INSERT INTO @list
SELECT * FROM SplitToInt(@grouplist, ',');

INSERT INTO user_groups(userId, groupId)
SELECT ug.userId, @groupId 
FROM user_groups ug 
INNER JOIN @list l ON ug.groupId = l.groupId
WHERE EXISTS (SELECT userId FROM users_groups WHERE groupId = l.groupId)
这里有两个问题:

您需要排除组40中已存在的所有用户 如果用户在多个其他组中,您也不希望添加两次用户。 我们可以用EXCEPT解决第一个问题,它将删除所有现有用户

除此之外,它还解决了第二个问题,因为它意味着错误

插入用户\u groupsuserId,groupId 选择ug.userId、@groupId 来自用户组 ug.groupId=l.groupId上列表l的内部联接 例外-例外意味着不同 选择userId,groupId 来自用户组; 旁白:应使用适当的表类型参数,而不是字符串拆分:

创建类型GroupList作为表groupId int NOT NULL; 在此处创建过程yourProcedureHere @targetGroupId int, @组列表IntList 像 .....
因此,您希望将50、52、53的所有用户插入到40中,忽略40中的现有用户,忽略重复用户,例如50和52中的用户?养成懒惰/坏习惯。插入@列表选择。。。始终指定列列表。始终使用模式限定对象名称。但是,表变量也可能没有必要或没有好处。建议在Erland非常有用的网站上阅读。谢谢!这就是我要找的。