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

SQL Server 2016下T-SQL循环关联Users与Role表查询用户名称

解决SQL Server 2016中逗号分隔UserId关联Users表的问题

嘿,这个问题我之前也碰到过,核心就是把Role表里逗号分隔的UserId拆成单个值,再和Users表关联就行!SQL Server 2016刚好自带了STRING_SPLIT函数,用它处理这种字符串拆分超方便。

先给你完整的解决方案,包括测试用的示例数据和查询代码:

第一步:创建并填充测试表(和你给出的结构一致)

-- 创建Users表
CREATE TABLE Users (
    Id INT PRIMARY KEY,
    Name NVARCHAR(50)
);

INSERT INTO Users VALUES
(1, 'Lisa'),
(2, 'Paul'),
(3, 'John'),
(4, 'Mike'),
(5, 'Tom');

-- 创建Role表
CREATE TABLE Role (
    Id INT PRIMARY KEY,
    UserId NVARCHAR(100),
    Role NVARCHAR(50)
);

INSERT INTO Role VALUES
(1, '2,4,5', 'Admin'), -- 示例的多值UserId
(2, '1,3', 'Editor'); -- 额外加一条测试数据

第二步:编写查询语句获取对应用户名

SELECT DISTINCT u.Name
FROM Role r
CROSS APPLY STRING_SPLIT(r.UserId, ',') AS split
JOIN Users u ON CAST(split.value AS INT) = u.Id
-- 若需按角色过滤,可添加WHERE条件,比如 WHERE r.Role = 'Admin'
ORDER BY u.Name;

代码说明:

  • CROSS APPLY STRING_SPLIT(r.UserId, ','):将Role表每一行的UserId字符串按逗号拆分成多行记录,每一行对应一个独立的UserId值。
  • CAST(split.value AS INT):由于STRING_SPLIT返回的value是字符串类型,需转换为INT才能和Users表的Id(INT类型)匹配关联。
  • DISTINCT:如果同一个用户出现在多个Role记录中,用它避免重复的用户名。
  • ORDER BY:让结果更整齐,可根据需求自行移除。

示例结果

运行上述查询会得到:

John
Lisa
Mike
Paul
Tom

如果添加WHERE r.Role = 'Admin',结果则为:

Mike
Paul
Tom

要是你担心STRING_SPLIT的兼容性(其实SQL Server 2016及以上版本都支持),也可以用自定义拆分函数,但官方自带的STRING_SPLIT在性能和易用性上都更优,优先用它就好。

内容的提问来源于stack exchange,提问作者Cindro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:22:22