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
相关产品推荐
相关产品推荐

