Sql server 从一个表插入到另一个问题
我在尝试使以下存储过程正常工作时遇到问题。我有一个由用户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已经有记录,所以添加失败 以下是我的存储过程: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。我希望将
@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非常有用的网站上阅读。谢谢!这就是我要找的。