如何在SQL中为特定用户批量添加多条部门记录?
解决方案
1. 调整数据库表结构(核心优化)
当前users表把多个部门存为逗号分隔字符串的设计,无法满足一行一个部门的需求。正确的做法是拆分两张表:
users表:保留用户基础信息(u_ADUN、u_FirstName、u_LastName等),移除u_Departments字段user_departments表:存储用户-部门关联关系,字段至少包含user_id(关联users表的u_ADUN)、department_name,可按需添加创建时间、创建人等字段
这种设计符合数据库范式,方便后续查询、更新和维护,是长期解决方案。
2. 单条SQL批量插入部门记录
表结构调整后,可通过批量INSERT语句一次性添加多条记录:
INSERT INTO [TV_App].[dbo].[user_departments] (user_id, department_name, created_on, created_by) VALUES ('John', 'Deli', '2024-05-20 10:00:00', 'admin'), ('John', 'Frozen Goods', '2024-05-20 10:00:00', 'admin'), ('John', 'Bakery', '2024-05-20 10:00:00', 'admin')
3. 结合C#实现安全批量插入
从复选框获取选中部门后,用参数化查询拼接批量插入逻辑(避免SQL注入,你的现有代码直接拼接字符串存在严重安全风险):
// 先执行用户基础信息的UPDATE/INSERT逻辑(复用你现有代码的这部分) // 处理部门关联插入 var selectedDepartments = checkedListBox1.CheckedItems.Cast<string>().ToList(); if (selectedDepartments.Count == 0) return; var sqlTemplate = "INSERT INTO [TV_App].[dbo].[user_departments] (user_id, department_name, created_on, created_by) VALUES "; var parameters = new List<SqlParameter>(); var valueClauses = new List<string>(); for (int i = 0; i < selectedDepartments.Count; i++) { valueClauses.Add($"(@userId{i}, @dept{i}, @createdOn, @createdBy)"); parameters.Add(new SqlParameter($"@userId{i}", username)); parameters.Add(new SqlParameter($"@dept{i}", selectedDepartments[i])); } // 添加公共参数 parameters.Add(new SqlParameter("@createdOn", DateTime.Now)); parameters.Add(new SqlParameter("@createdBy", Environment.UserName.ToLower())); var finalSql = sqlTemplate + string.Join(", ", valueClauses); using (var cmd = new SqlCommand(finalSql, conn)) { cmd.Parameters.AddRange(parameters.ToArray()); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); }
4. 临时方案(不推荐)
若暂时无法调整表结构,可先删除该用户原有记录,再批量插入新记录(但会导致users表存在重复用户信息,后续维护成本高):
-- 删除旧记录 DELETE FROM [TV_App].[dbo].[users] WHERE [u_ADUN] = 'John'; -- 批量插入新记录 INSERT INTO [TV_App].[dbo].[users] (u_ADUN, u_FirstName, u_LastName, u_Admin, u_Departments, u_CreatedOn, u_CreatedBy, u_LastEditedOn, u_LastEditedBy, u_LastLoginOn, u_LastLoginFrom, u_FirstLoginOn, u_FirstLoginFrom, u_UsageCount) VALUES ('John', 'John', 'Doe', 0, 'Deli', '2024-05-20 10:00:00', 'admin', '2024-05-20 10:00:00', 'admin', '2024-05-20 10:00:00', 'newuser', '2024-05-20 10:00:00', 'newuser', 0), ('John', 'John', 'Doe', 0, 'Frozen Goods', '2024-05-20 10:00:00', 'admin', '2024-05-20 10:00:00', 'admin', '2024-05-20 10:00:00', 'newuser', '2024-05-20 10:00:00', 'newuser', 0), ('John', 'John', 'Doe', 0, 'Bakery', '2024-05-20 10:00:00', 'admin', '2024-05-20 10:00:00', 'admin', '2024-05-20 10:00:00', 'newuser', '2024-05-20 10:00:00', 'newuser', 0)
内容的提问来源于stack exchange,提问作者user19950465
相关产品推荐
相关产品推荐

