You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:01:41